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,252 +0,0 @@
1
- import { customDatabaseFilterToken, Filter } from '../filter/filter-interfaces';
2
- import { CompoundIdField } from '../column';
3
- export class ArrayEntityDataProvider {
4
- entity;
5
- rows;
6
- static rawFilter(filter) {
7
- return {
8
- [customDatabaseFilterToken]: {
9
- arrayFilter: filter
10
- }
11
- };
12
- }
13
- constructor(entity, rows) {
14
- this.entity = entity;
15
- this.rows = rows;
16
- if (!rows)
17
- rows = [];
18
- else {
19
- for (const r of rows) {
20
- this.verifyThatRowHasAllNotNullColumns(r);
21
- }
22
- }
23
- }
24
- verifyThatRowHasAllNotNullColumns(r) {
25
- for (const f of this.entity.fields) {
26
- if (!f.isServerExpression)
27
- if (!f.allowNull) {
28
- if (r[f.key] === undefined || r[f.key] === null) {
29
- let val = undefined;
30
- if (f.valueType === Boolean)
31
- val = false;
32
- else if (f.valueType === Number)
33
- val = 0;
34
- else if (f.valueType === String)
35
- val = '';
36
- r[f.key] = val;
37
- }
38
- }
39
- else if (r[f.key] === undefined)
40
- r[f.key] = null;
41
- }
42
- }
43
- async count(where) {
44
- let rows = this.rows;
45
- let j = 0;
46
- for (let i = 0; i < rows.length; i++) {
47
- if (!where) {
48
- j++;
49
- }
50
- else {
51
- let x = new FilterConsumerBridgeToObject(rows[i]);
52
- where.__applyToConsumer(x);
53
- if (x.ok)
54
- j++;
55
- }
56
- }
57
- return j;
58
- }
59
- async find(options) {
60
- let rows = this.rows;
61
- if (options) {
62
- if (options.where) {
63
- rows = rows.filter(i => {
64
- let x = new FilterConsumerBridgeToObject(i);
65
- options.where.__applyToConsumer(x);
66
- return x.ok;
67
- });
68
- }
69
- if (options.orderBy) {
70
- rows = rows.sort((a, b) => {
71
- return options.orderBy.compare(a, b);
72
- });
73
- }
74
- rows = pageArray(rows, options);
75
- }
76
- if (rows)
77
- return rows.map(i => {
78
- return this.translateFromJson(i);
79
- });
80
- }
81
- translateFromJson(row) {
82
- let result = {};
83
- for (const col of this.entity.fields) {
84
- result[col.key] = col.valueConverter.fromJson(row[col.key]);
85
- }
86
- return result;
87
- }
88
- translateToJson(row) {
89
- let result = {};
90
- for (const col of this.entity.fields) {
91
- result[col.key] = col.valueConverter.toJson(row[col.key]);
92
- }
93
- return result;
94
- }
95
- idMatches(id) {
96
- return item => {
97
- let x = new FilterConsumerBridgeToObject(item);
98
- Filter.fromEntityFilter(this.entity, this.entity.idMetadata.getIdFilter(id)).__applyToConsumer(x);
99
- return x.ok;
100
- };
101
- }
102
- update(id, data) {
103
- let idMatches = this.idMatches(id);
104
- let keys = Object.keys(data);
105
- for (let i = 0; i < this.rows.length; i++) {
106
- let r = this.rows[i];
107
- if (idMatches(r)) {
108
- let newR = { ...r };
109
- for (const f of this.entity.fields) {
110
- if (!f.dbReadOnly && !f.isServerExpression) {
111
- if (keys.includes(f.key)) {
112
- newR[f.key] = f.valueConverter.toJson(data[f.key]);
113
- }
114
- }
115
- }
116
- this.verifyThatRowHasAllNotNullColumns(newR);
117
- this.rows[i] = newR;
118
- return Promise.resolve(this.translateFromJson(this.rows[i]));
119
- }
120
- }
121
- throw new Error("couldn't find id to update: " + id);
122
- }
123
- delete(id) {
124
- let idMatches = this.idMatches(id);
125
- for (let i = 0; i < this.rows.length; i++) {
126
- if (idMatches(this.rows[i])) {
127
- this.rows.splice(i, 1);
128
- return Promise.resolve();
129
- }
130
- }
131
- throw new Error("couldn't find id to delete: " + id);
132
- }
133
- async insert(data) {
134
- let idf = this.entity.idMetadata.field;
135
- if (!(idf instanceof CompoundIdField)) {
136
- if (idf.options.valueConverter?.fieldTypeInDb === 'autoincrement') {
137
- data[idf.key] = 1;
138
- for (const row of this.rows) {
139
- if (row[idf.key] >= data[idf.key])
140
- data[idf.key] = row[idf.key] + 1;
141
- }
142
- }
143
- if (data[idf.key])
144
- this.rows.forEach(i => {
145
- if (data[idf.key] == i[idf.key])
146
- throw Error("id already exists");
147
- });
148
- }
149
- let j = this.translateToJson(data);
150
- this.verifyThatRowHasAllNotNullColumns(j);
151
- this.rows.push(j);
152
- return Promise.resolve(this.translateFromJson(j));
153
- }
154
- }
155
- function pageArray(rows, options) {
156
- if (!options)
157
- return rows;
158
- if (!options.limit)
159
- return rows;
160
- let page = 1;
161
- if (options.page)
162
- page = options.page;
163
- if (page < 1)
164
- page = 1;
165
- let x = 0;
166
- return rows.filter(i => {
167
- x++;
168
- let max = page * options.limit;
169
- let min = max - options.limit;
170
- return x > min && x <= max;
171
- });
172
- }
173
- class FilterConsumerBridgeToObject {
174
- row;
175
- ok = true;
176
- constructor(row) {
177
- this.row = row;
178
- }
179
- databaseCustom(databaseCustom) {
180
- if (databaseCustom && databaseCustom.arrayFilter) {
181
- if (!databaseCustom.arrayFilter(this.row))
182
- this.ok = false;
183
- }
184
- }
185
- custom(key, customItem) {
186
- throw new Error('Custom Filter should be translated before it gets here');
187
- }
188
- or(orElements) {
189
- for (const element of orElements) {
190
- let filter = new FilterConsumerBridgeToObject(this.row);
191
- element.__applyToConsumer(filter);
192
- if (filter.ok) {
193
- return;
194
- }
195
- }
196
- this.ok = false;
197
- }
198
- isNull(col) {
199
- if (this.row[col.key] != null)
200
- this.ok = false;
201
- }
202
- isNotNull(col) {
203
- if (this.row[col.key] == null)
204
- this.ok = false;
205
- }
206
- isIn(col, val) {
207
- for (const v of val) {
208
- if (this.row[col.key] == col.valueConverter.toJson(v)) {
209
- return;
210
- }
211
- }
212
- this.ok = false;
213
- }
214
- isEqualTo(col, val) {
215
- if (this.row[col.key] != col.valueConverter.toJson(val))
216
- this.ok = false;
217
- }
218
- isDifferentFrom(col, val) {
219
- if (this.row[col.key] == col.valueConverter.toJson(val))
220
- this.ok = false;
221
- }
222
- isGreaterOrEqualTo(col, val) {
223
- if (this.row[col.key] < col.valueConverter.toJson(val))
224
- this.ok = false;
225
- }
226
- isGreaterThan(col, val) {
227
- if (this.row[col.key] <= col.valueConverter.toJson(val))
228
- this.ok = false;
229
- }
230
- isLessOrEqualTo(col, val) {
231
- if (this.row[col.key] > col.valueConverter.toJson(val))
232
- this.ok = false;
233
- }
234
- isLessThan(col, val) {
235
- if (this.row[col.key] >= col.valueConverter.toJson(val))
236
- this.ok = false;
237
- }
238
- containsCaseInsensitive(col, val) {
239
- let v = this.row[col.key];
240
- if (!v) {
241
- this.ok = false;
242
- return;
243
- }
244
- let s = '' + v;
245
- if (val)
246
- val = col.valueConverter.toJson(val);
247
- if (val)
248
- val = val.toString().toLowerCase();
249
- if (s.toLowerCase().indexOf(val) < 0)
250
- this.ok = false;
251
- }
252
- }
@@ -1,9 +0,0 @@
1
- import { DataProvider, EntityDataProvider } from '../data-interfaces';
2
- import { __RowsOfDataForTesting } from "../__RowsOfDataForTesting";
3
- import { EntityMetadata } from '../remult3';
4
- export declare class InMemoryDataProvider implements DataProvider, __RowsOfDataForTesting {
5
- transaction(action: (dataProvider: DataProvider) => Promise<void>): Promise<void>;
6
- rows: any;
7
- getEntityDataProvider(entity: EntityMetadata): EntityDataProvider;
8
- toString(): string;
9
- }
@@ -1,14 +0,0 @@
1
- import { ArrayEntityDataProvider } from './array-entity-data-provider';
2
- export class InMemoryDataProvider {
3
- async transaction(action) {
4
- await action(this);
5
- }
6
- rows = {};
7
- getEntityDataProvider(entity) {
8
- let name = entity.key;
9
- if (!this.rows[name])
10
- this.rows[name] = [];
11
- return new ArrayEntityDataProvider(entity, this.rows[name]);
12
- }
13
- toString() { return "InMemoryDataProvider"; }
14
- }
@@ -1,12 +0,0 @@
1
- import { EntityDataProvider, DataProvider } from '../data-interfaces';
2
- import { EntityMetadata } from '../remult3';
3
- export interface JsonEntityStorage {
4
- getItem(entityDbName: string): string | null;
5
- setItem(entityDbName: string, json: string): any;
6
- }
7
- export declare class JsonDataProvider implements DataProvider {
8
- private storage;
9
- constructor(storage: JsonEntityStorage);
10
- getEntityDataProvider(entity: EntityMetadata): EntityDataProvider;
11
- transaction(action: (dataProvider: DataProvider) => Promise<void>): Promise<void>;
12
- }
@@ -1,55 +0,0 @@
1
- import { ArrayEntityDataProvider } from './array-entity-data-provider';
2
- export class JsonDataProvider {
3
- storage;
4
- constructor(storage) {
5
- this.storage = storage;
6
- }
7
- getEntityDataProvider(entity) {
8
- return new JsonEntityDataProvider(entity, this.storage);
9
- }
10
- async transaction(action) {
11
- await action(this);
12
- }
13
- }
14
- class JsonEntityDataProvider {
15
- entity;
16
- helper;
17
- constructor(entity, helper) {
18
- this.entity = entity;
19
- this.helper = helper;
20
- }
21
- async loadEntityData(what) {
22
- let data = [];
23
- let dbName = await this.entity.getDbName();
24
- let s = this.helper.getItem(dbName);
25
- if (s)
26
- data = JSON.parse(s);
27
- let dp = new ArrayEntityDataProvider(this.entity, data);
28
- return what(dp, () => this.helper.setItem(dbName, JSON.stringify(data, undefined, 2)));
29
- }
30
- p = Promise.resolve();
31
- find(options) {
32
- return this.p = this.p.then(() => this.loadEntityData((dp, save) => dp.find(options)));
33
- }
34
- count(where) {
35
- return this.p = this.p.then(() => this.loadEntityData((dp, save) => dp.count(where)));
36
- }
37
- update(id, data) {
38
- return this.p = this.p.then(() => this.loadEntityData((dp, save) => dp.update(id, data).then(x => {
39
- save();
40
- return x;
41
- })));
42
- }
43
- delete(id) {
44
- return this.p = this.p.then(() => this.loadEntityData((dp, save) => dp.delete(id).then(x => {
45
- save();
46
- return x;
47
- })));
48
- }
49
- async insert(data) {
50
- return this.p = this.p.then(() => this.loadEntityData((dp, save) => dp.insert(data).then(x => {
51
- save();
52
- return x;
53
- })));
54
- }
55
- }
@@ -1,49 +0,0 @@
1
- import { EntityDataProvider, DataProvider, EntityDataProviderFindOptions, RestDataProviderHttpProvider } from '../data-interfaces';
2
- import { UrlBuilder } from '../../urlBuilder';
3
- import { Filter } from '../filter/filter-interfaces';
4
- import { EntityMetadata, FindOptions } from '../remult3';
5
- import { ApiClient } from '../context';
6
- export declare class RestDataProvider implements DataProvider {
7
- private apiProvider;
8
- constructor(apiProvider: () => ApiClient);
9
- getEntityDataProvider(entity: EntityMetadata): RestEntityDataProvider;
10
- transaction(action: (dataProvider: DataProvider) => Promise<void>): Promise<void>;
11
- isProxy: boolean;
12
- }
13
- export declare function findOptionsToJson(options: FindOptions<any>, meta: EntityMetadata): any;
14
- export declare function findOptionsFromJson(json: any, meta: EntityMetadata): FindOptions<any>;
15
- export declare class RestEntityDataProvider implements EntityDataProvider {
16
- private url;
17
- private http;
18
- private entity;
19
- constructor(url: () => string, http: () => RestDataProviderHttpProvider, entity: EntityMetadata);
20
- translateFromJson(row: any): {};
21
- translateToJson(row: any): {};
22
- count(where: Filter): Promise<number>;
23
- find(options?: EntityDataProviderFindOptions): Promise<Array<any>>;
24
- buildFindRequest(options: EntityDataProviderFindOptions): {
25
- createKey: () => string;
26
- run: (action?: string) => Promise<any>;
27
- subscribe: (queryId: any) => Promise<{
28
- result: any[];
29
- unsubscribe: () => Promise<any>;
30
- }>;
31
- };
32
- update(id: any, data: any): Promise<any>;
33
- delete(id: any): Promise<void>;
34
- insert(data: any): Promise<any>;
35
- }
36
- export declare class RestDataProviderHttpProviderUsingFetch implements RestDataProviderHttpProvider {
37
- private fetch?;
38
- constructor(fetch?: ((input: RequestInfo, init?: RequestInit) => Promise<Response>) | undefined);
39
- get(url: string): Promise<any>;
40
- put(url: string, data: any): Promise<any>;
41
- delete(url: string): Promise<any>;
42
- post(url: string, data: any): Promise<any>;
43
- myFetch(url: string, options?: {
44
- method?: string;
45
- body?: string;
46
- }): Promise<any>;
47
- }
48
- export declare function addFilterToUrlAndReturnTrueIfSuccessful(filter: any, url: UrlBuilder): boolean;
49
- export declare const liveQueryAction = "liveQuery-";
@@ -1,256 +0,0 @@
1
- import { UrlBuilder } from '../../urlBuilder';
2
- import { customUrlToken, Filter } from '../filter/filter-interfaces';
3
- import { buildRestDataProvider, retry } from "../buildRestDataProvider";
4
- import { actionInfo } from '../server-action';
5
- export class RestDataProvider {
6
- apiProvider;
7
- constructor(apiProvider) {
8
- this.apiProvider = apiProvider;
9
- }
10
- getEntityDataProvider(entity) {
11
- return new RestEntityDataProvider(() => {
12
- let url = this.apiProvider()?.url;
13
- if (url === undefined || url === null)
14
- url = '/api';
15
- return url + '/' + entity.key;
16
- }, () => {
17
- return buildRestDataProvider(this.apiProvider().httpClient);
18
- }, entity);
19
- }
20
- async transaction(action) {
21
- throw new Error("Method not implemented.");
22
- }
23
- isProxy = true;
24
- }
25
- //@internal
26
- export function findOptionsToJson(options, meta) {
27
- const r = {
28
- ...options,
29
- where: Filter.entityFilterToJson(meta, options.where),
30
- };
31
- if (options.load)
32
- r.load = options.load(meta.fields).map(y => y.key);
33
- return r;
34
- }
35
- //@internal
36
- export function findOptionsFromJson(json, meta) {
37
- let r = {};
38
- for (const key of ["limit", "page", "where", "orderBy"]) {
39
- if (json[key] !== undefined) {
40
- if (key === "where") {
41
- r[key] = Filter.entityFilterFromJson(meta, json.where);
42
- }
43
- else
44
- r[key] = json[key];
45
- }
46
- }
47
- if (json.load) {
48
- r.load = (z) => json.load.map(y => z.find(y));
49
- }
50
- return r;
51
- }
52
- export class RestEntityDataProvider {
53
- url;
54
- http;
55
- entity;
56
- constructor(url, http, entity) {
57
- this.url = url;
58
- this.http = http;
59
- this.entity = entity;
60
- }
61
- translateFromJson(row) {
62
- let result = {};
63
- for (const col of this.entity.fields) {
64
- result[col.key] = col.valueConverter.fromJson(row[col.key]);
65
- }
66
- return result;
67
- }
68
- translateToJson(row) {
69
- let result = {};
70
- for (const col of this.entity.fields) {
71
- result[col.key] = col.valueConverter.toJson(row[col.key]);
72
- }
73
- return result;
74
- }
75
- async count(where) {
76
- const { run } = this.buildFindRequest({ where });
77
- return run("count").then(r => +r.count);
78
- }
79
- find(options) {
80
- let { run } = this.buildFindRequest(options);
81
- return run().then(x => x.map(y => this.translateFromJson(y)));
82
- }
83
- //@internal
84
- buildFindRequest(options) {
85
- let url = new UrlBuilder(this.url());
86
- let filterObject;
87
- if (options) {
88
- if (options.where) {
89
- filterObject = options.where.toJson(); // options.where.__applyToConsumer(new FilterConsumnerBridgeToUrlBuilder(url));
90
- if (addFilterToUrlAndReturnTrueIfSuccessful(filterObject, url))
91
- filterObject = undefined;
92
- }
93
- if (options.orderBy && options.orderBy.Segments) {
94
- let sort = '';
95
- let order = '';
96
- let hasDescending = false;
97
- options.orderBy.Segments.forEach(c => {
98
- if (sort.length > 0) {
99
- sort += ",";
100
- order += ",";
101
- }
102
- sort += c.field.key;
103
- order += c.isDescending ? "desc" : "asc";
104
- if (c.isDescending)
105
- hasDescending = true;
106
- });
107
- if (sort)
108
- url.add('_sort', sort);
109
- if (hasDescending)
110
- url.add('_order', order);
111
- }
112
- if (options.limit)
113
- url.add('_limit', options.limit);
114
- if (options.page)
115
- url.add('_page', options.page);
116
- }
117
- const run = (action) => {
118
- let u = new UrlBuilder(url.url);
119
- if (!action && filterObject) {
120
- action = "get";
121
- }
122
- if (action)
123
- u.add("__action", action);
124
- if (filterObject) {
125
- return this.http().post(u.url, filterObject);
126
- }
127
- else
128
- return this.http().get(u.url);
129
- };
130
- return {
131
- createKey: () => JSON.stringify({ url, filterObject }),
132
- run,
133
- subscribe: async (queryId) => {
134
- const result = await run(liveQueryAction + queryId);
135
- return {
136
- result,
137
- unsubscribe: async () => {
138
- return actionInfo.runActionWithoutBlockingUI(() => this.http().post(this.url() + "?__action=endLiveQuery", {
139
- id: queryId
140
- }));
141
- }
142
- };
143
- }
144
- };
145
- }
146
- update(id, data) {
147
- let result = {};
148
- let keys = Object.keys(data);
149
- for (const col of this.entity.fields) {
150
- if (keys.includes(col.key))
151
- result[col.key] = col.valueConverter.toJson(data[col.key]);
152
- }
153
- return this.http().put(this.url() + '/' + encodeURIComponent(id), result).then(y => this.translateFromJson(y));
154
- }
155
- delete(id) {
156
- return this.http().delete(this.url() + '/' + encodeURIComponent(id));
157
- }
158
- insert(data) {
159
- return this.http().post(this.url(), this.translateToJson(data)).then(y => this.translateFromJson(y));
160
- }
161
- }
162
- export class RestDataProviderHttpProviderUsingFetch {
163
- fetch;
164
- constructor(fetch) {
165
- this.fetch = fetch;
166
- }
167
- async get(url) {
168
- return await retry(async () => this.myFetch(url).then(r => {
169
- return r;
170
- }));
171
- }
172
- put(url, data) {
173
- return this.myFetch(url, {
174
- method: 'put',
175
- body: JSON.stringify(data)
176
- });
177
- }
178
- delete(url) {
179
- return this.myFetch(url, { method: 'delete' });
180
- }
181
- async post(url, data) {
182
- return await retry(() => this.myFetch(url, {
183
- method: 'post',
184
- body: JSON.stringify(data)
185
- }));
186
- }
187
- myFetch(url, options) {
188
- const headers = {};
189
- if (options?.body)
190
- headers["Content-type"] = "application/json";
191
- if (typeof window !== 'undefined' && typeof window.document !== 'undefined' && typeof (window.document.cookie !== 'undefined'))
192
- for (const cookie of window.document.cookie.split(';')) {
193
- if (cookie.trim().startsWith('XSRF-TOKEN=')) {
194
- headers['X-XSRF-TOKEN'] = cookie.split('=')[1];
195
- }
196
- }
197
- return (this.fetch || fetch)(url, {
198
- credentials: 'include',
199
- method: options?.method,
200
- body: options?.body,
201
- headers
202
- }).then(response => {
203
- return onSuccess(response);
204
- }).catch(async (error) => {
205
- let r = await error;
206
- throw r;
207
- });
208
- }
209
- }
210
- function onSuccess(response) {
211
- if (response.status == 204)
212
- return;
213
- if (response.status >= 200 && response.status < 300)
214
- return response.json();
215
- else {
216
- throw response.json().then(x => {
217
- return { ...x, message: x.message || response.statusText, url: response.url, status: response.status };
218
- }).catch(() => {
219
- throw {
220
- message: response.statusText,
221
- url: response.url,
222
- status: response.status
223
- };
224
- });
225
- }
226
- }
227
- export function addFilterToUrlAndReturnTrueIfSuccessful(filter, url) {
228
- for (const key in filter) {
229
- if (Object.prototype.hasOwnProperty.call(filter, key)) {
230
- const element = filter[key];
231
- if (Array.isArray(element)) {
232
- if (element.length > 0 && typeof element[0] === 'object')
233
- return false;
234
- if (element.length > 10)
235
- return false;
236
- }
237
- }
238
- }
239
- for (const key in filter) {
240
- if (Object.prototype.hasOwnProperty.call(filter, key)) {
241
- const element = filter[key];
242
- if (Array.isArray(element)) {
243
- if (key.endsWith(".in"))
244
- url.add(key, JSON.stringify(element));
245
- else
246
- element.forEach(e => url.add(key, e));
247
- }
248
- else if (key.startsWith(customUrlToken))
249
- url.add(key, JSON.stringify(element));
250
- else
251
- url.add(key, element);
252
- }
253
- }
254
- return true;
255
- }
256
- export const liveQueryAction = "liveQuery-";
@@ -1,33 +0,0 @@
1
- import { EntityDataProvider, DataProvider } from "../data-interfaces";
2
- import { SqlCommand, SqlCommandWithParameters, SqlImplementation, SqlResult } from "../sql-command";
3
- import { CustomSqlFilterBuilderFunction } from "../filter/filter-consumer-bridge-to-sql-request";
4
- import { EntityMetadata, EntityFilter, RepositoryOverloads } from "../remult3";
5
- import { Remult } from "../context";
6
- export declare class SqlDatabase implements DataProvider {
7
- private sql;
8
- static getDb(remult?: Remult): SqlDatabase;
9
- createCommand(): SqlCommand;
10
- execute(sql: string): Promise<SqlResult>;
11
- _getSourceSql(): SqlImplementation;
12
- ensureSchema(entities: EntityMetadata<any>[]): Promise<void>;
13
- getEntityDataProvider(entity: EntityMetadata): EntityDataProvider;
14
- transaction(action: (dataProvider: DataProvider) => Promise<void>): Promise<void>;
15
- static rawFilter(build: CustomSqlFilterBuilderFunction): EntityFilter<any>;
16
- static filterToRaw<entityType>(repo: RepositoryOverloads<entityType>, condition: EntityFilter<entityType>, sqlCommand?: SqlCommandWithParameters): Promise<string>;
17
- /**
18
- * `false` _(default)_ - No logging
19
- *
20
- * `true` - to log all queries to the console
21
- *
22
- * `oneLiner` - to log all queries to the console as one line
23
- *
24
- * a `function` - to log all queries to the console as a custom format
25
- */
26
- static LogToConsole: boolean | 'oneLiner' | ((duration: number, query: string, args: Record<string, any>) => void);
27
- /**
28
- * Threshold in milliseconds for logging queries to the console.
29
- */
30
- static durationThreshold: number;
31
- constructor(sql: SqlImplementation);
32
- private createdEntities;
33
- }