remult 0.22.2 → 0.22.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (255) hide show
  1. package/esm/graphql.js +27 -27
  2. package/esm/postgres/schema-builder.js +4 -4
  3. package/esm/remult-knex/index.js +2 -2
  4. package/esm/src/backend-tests/backend-database-test-setup.backend-spec.js +10 -0
  5. package/esm/src/id-entity.d.ts +4 -0
  6. package/esm/src/id-entity.js +8 -0
  7. package/esm/src/remult3/RepositoryImplementation.js +7 -5
  8. package/esm/src/shared-tests/db-tests.db-tests.js +35 -0
  9. package/package.json +1 -1
  10. package/postgres/postgresColumnSyntax.d.ts +2 -0
  11. package/postgres/postgresColumnSyntax.js +34 -0
  12. package/remult-knex/index.js +2 -2
  13. package/remult-middleware.d.ts +2 -0
  14. package/remult-middleware.js +70 -0
  15. package/server/register-actions-on-server.d.ts +3 -0
  16. package/server/register-actions-on-server.js +50 -0
  17. package/server/register-entities-on-server.d.ts +3 -0
  18. package/server/register-entities-on-server.js +19 -0
  19. package/src/backend-tests/backend-database-test-setup.backend-spec.js +10 -0
  20. package/{esm/core/src → src}/backend-tests/my-test.backend-spec.d.ts +1 -1
  21. package/src/backend-tests/my-test.backend-spec.js +217 -0
  22. package/src/backend-tests/test-http-server.backend-spec.d.ts +6 -0
  23. package/src/backend-tests/test-http-server.backend-spec.js +342 -0
  24. package/src/id-entity.d.ts +4 -0
  25. package/src/id-entity.js +17 -0
  26. package/src/remult3/RepositoryImplementation.js +15 -13
  27. package/src/shared-tests/db-tests.db-tests.js +64 -0
  28. package/{esm/core/src/valueConverters.d.ts → valueConverters.d.ts} +12 -13
  29. package/valueConverters.js +168 -0
  30. package/esm/angular/interfaces/index.d.ts +0 -1
  31. package/esm/angular/interfaces/index.js +0 -1
  32. package/esm/angular/interfaces/src/column-collection.d.ts +0 -70
  33. package/esm/angular/interfaces/src/column-collection.js +0 -341
  34. package/esm/angular/interfaces/src/data-area-settings.d.ts +0 -15
  35. package/esm/angular/interfaces/src/data-area-settings.js +0 -35
  36. package/esm/angular/interfaces/src/data-control-interfaces.d.ts +0 -36
  37. package/esm/angular/interfaces/src/data-control-interfaces.js +0 -57
  38. package/esm/angular/interfaces/src/dataList.d.ts +0 -13
  39. package/esm/angular/interfaces/src/dataList.js +0 -42
  40. package/esm/angular/interfaces/src/filter-helper.d.ts +0 -13
  41. package/esm/angular/interfaces/src/filter-helper.js +0 -59
  42. package/esm/angular/interfaces/src/grid-settings.d.ts +0 -145
  43. package/esm/angular/interfaces/src/grid-settings.js +0 -387
  44. package/esm/angular/interfaces/src/public_api.d.ts +0 -4
  45. package/esm/angular/interfaces/src/public_api.js +0 -4
  46. package/esm/angular/src/angular/RemultAngularPluginsService.d.ts +0 -4
  47. package/esm/angular/src/angular/RemultAngularPluginsService.js +0 -3
  48. package/esm/angular/src/angular/data-control/data-control2.component.d.ts +0 -49
  49. package/esm/angular/src/angular/data-control/data-control2.component.js +0 -138
  50. package/esm/core/SseSubscriptionServer.d.ts +0 -33
  51. package/esm/core/SseSubscriptionServer.js +0 -107
  52. package/esm/core/assign.d.ts +0 -1
  53. package/esm/core/assign.js +0 -5
  54. package/esm/core/classType.d.ts +0 -3
  55. package/esm/core/classType.js +0 -1
  56. package/esm/core/index.d.ts +0 -27
  57. package/esm/core/index.js +0 -25
  58. package/esm/core/inputTypes.d.ts +0 -9
  59. package/esm/core/inputTypes.js +0 -9
  60. package/esm/core/live-query/data-provider-live-query-storage.d.ts +0 -22
  61. package/esm/core/live-query/data-provider-live-query-storage.js +0 -71
  62. package/esm/core/postgres/index.d.ts +0 -2
  63. package/esm/core/postgres/index.js +0 -2
  64. package/esm/core/postgres/postgres-data-provider.d.ts +0 -36
  65. package/esm/core/postgres/postgres-data-provider.js +0 -120
  66. package/esm/core/postgres/schema-builder.d.ts +0 -17
  67. package/esm/core/postgres/schema-builder.js +0 -153
  68. package/esm/core/remult-fresh.d.ts +0 -17
  69. package/esm/core/remult-fresh.js +0 -29
  70. package/esm/core/remult-knex/index.d.ts +0 -30
  71. package/esm/core/remult-knex/index.js +0 -446
  72. package/esm/core/remult-mongo.d.ts +0 -24
  73. package/esm/core/remult-mongo.js +0 -254
  74. package/esm/core/server/JsonEntityFileStorage.d.ts +0 -10
  75. package/esm/core/server/JsonEntityFileStorage.js +0 -25
  76. package/esm/core/server/core.d.ts +0 -4
  77. package/esm/core/server/core.js +0 -4
  78. package/esm/core/server/expressBridge.d.ts +0 -182
  79. package/esm/core/server/expressBridge.js +0 -938
  80. package/esm/core/server/index.d.ts +0 -6
  81. package/esm/core/server/index.js +0 -9
  82. package/esm/core/server/initAsyncHooks.d.ts +0 -1
  83. package/esm/core/server/initAsyncHooks.js +0 -9
  84. package/esm/core/server/initDataProvider.d.ts +0 -2
  85. package/esm/core/server/initDataProvider.js +0 -14
  86. package/esm/core/src/__EntityValueProvider.d.ts +0 -11
  87. package/esm/core/src/__EntityValueProvider.js +0 -1
  88. package/esm/core/src/__RowsOfDataForTesting.d.ts +0 -3
  89. package/esm/core/src/__RowsOfDataForTesting.js +0 -1
  90. package/esm/core/src/backend-tests/backend-database-test-setup.backend-spec.d.ts +0 -6
  91. package/esm/core/src/backend-tests/backend-database-test-setup.backend-spec.js +0 -147
  92. package/esm/core/src/backend-tests/my-test.backend-spec.js +0 -197
  93. package/esm/core/src/backend-tests/test-http-server.backend-spec.d.ts +0 -1
  94. package/esm/core/src/backend-tests/test-http-server.backend-spec.js +0 -167
  95. package/esm/core/src/buildRestDataProvider.d.ts +0 -31
  96. package/esm/core/src/buildRestDataProvider.js +0 -113
  97. package/esm/core/src/column-interfaces.d.ts +0 -154
  98. package/esm/core/src/column-interfaces.js +0 -7
  99. package/esm/core/src/column.d.ts +0 -58
  100. package/esm/core/src/column.js +0 -174
  101. package/esm/core/src/context.d.ts +0 -134
  102. package/esm/core/src/context.js +0 -286
  103. package/esm/core/src/data-api.d.ts +0 -39
  104. package/esm/core/src/data-api.js +0 -279
  105. package/esm/core/src/data-interfaces.d.ts +0 -41
  106. package/esm/core/src/data-interfaces.js +0 -12
  107. package/esm/core/src/data-providers/array-entity-data-provider.d.ts +0 -22
  108. package/esm/core/src/data-providers/array-entity-data-provider.js +0 -252
  109. package/esm/core/src/data-providers/in-memory-database.d.ts +0 -9
  110. package/esm/core/src/data-providers/in-memory-database.js +0 -14
  111. package/esm/core/src/data-providers/json-data-provider.d.ts +0 -12
  112. package/esm/core/src/data-providers/json-data-provider.js +0 -55
  113. package/esm/core/src/data-providers/rest-data-provider.d.ts +0 -49
  114. package/esm/core/src/data-providers/rest-data-provider.js +0 -256
  115. package/esm/core/src/data-providers/sql-database.d.ts +0 -33
  116. package/esm/core/src/data-providers/sql-database.js +0 -384
  117. package/esm/core/src/data-providers/web-sql-data-provider.d.ts +0 -24
  118. package/esm/core/src/data-providers/web-sql-data-provider.js +0 -143
  119. package/esm/core/src/entity.d.ts +0 -91
  120. package/esm/core/src/entity.js +0 -1
  121. package/esm/core/src/filter/filter-consumer-bridge-to-sql-request.d.ts +0 -50
  122. package/esm/core/src/filter/filter-consumer-bridge-to-sql-request.js +0 -150
  123. package/esm/core/src/filter/filter-consumer-bridge-to-url-builder.d.ts +0 -1
  124. package/esm/core/src/filter/filter-consumer-bridge-to-url-builder.js +0 -1
  125. package/esm/core/src/filter/filter-interfaces.d.ts +0 -85
  126. package/esm/core/src/filter/filter-interfaces.js +0 -477
  127. package/esm/core/src/live-query/LiveQueryClient.d.ts +0 -20
  128. package/esm/core/src/live-query/LiveQueryClient.js +0 -188
  129. package/esm/core/src/live-query/SseSubscriptionClient.d.ts +0 -5
  130. package/esm/core/src/live-query/SseSubscriptionClient.js +0 -86
  131. package/esm/core/src/live-query/SubscriptionChannel.d.ts +0 -72
  132. package/esm/core/src/live-query/SubscriptionChannel.js +0 -123
  133. package/esm/core/src/live-query/SubscriptionServer.d.ts +0 -53
  134. package/esm/core/src/live-query/SubscriptionServer.js +0 -111
  135. package/esm/core/src/live-query/live-query-tests.spec.d.ts +0 -6
  136. package/esm/core/src/live-query/live-query-tests.spec.js +0 -952
  137. package/esm/core/src/remult-proxy.d.ts +0 -35
  138. package/esm/core/src/remult-proxy.js +0 -113
  139. package/esm/core/src/remult3/DecoratorReplacer.d.ts +0 -10
  140. package/esm/core/src/remult3/DecoratorReplacer.js +0 -20
  141. package/esm/core/src/remult3/RepositoryImplementation.d.ts +0 -355
  142. package/esm/core/src/remult3/RepositoryImplementation.js +0 -2109
  143. package/esm/core/src/remult3/index.d.ts +0 -2
  144. package/esm/core/src/remult3/index.js +0 -2
  145. package/esm/core/src/remult3/remult3.d.ts +0 -395
  146. package/esm/core/src/remult3/remult3.js +0 -2
  147. package/esm/core/src/server-action.d.ts +0 -81
  148. package/esm/core/src/server-action.js +0 -394
  149. package/esm/core/src/shared-tests/db-tests-setup.d.ts +0 -32
  150. package/esm/core/src/shared-tests/db-tests-setup.js +0 -78
  151. package/esm/core/src/shared-tests/db-tests.db-tests.d.ts +0 -25
  152. package/esm/core/src/shared-tests/db-tests.db-tests.js +0 -810
  153. package/esm/core/src/shared-tests/deleteAll.d.ts +0 -2
  154. package/esm/core/src/shared-tests/deleteAll.js +0 -4
  155. package/esm/core/src/shared-tests/entityWithValidations.d.ts +0 -14
  156. package/esm/core/src/shared-tests/entityWithValidations.js +0 -43
  157. package/esm/core/src/shared-tests/index.d.ts +0 -4
  158. package/esm/core/src/shared-tests/index.js +0 -4
  159. package/esm/core/src/shared-tests/test-custom-id-column.spec.d.ts +0 -1
  160. package/esm/core/src/shared-tests/test-custom-id-column.spec.js +0 -67
  161. package/esm/core/src/shared-tests/test-special-value.spec.d.ts +0 -10
  162. package/esm/core/src/shared-tests/test-special-value.spec.js +0 -73
  163. package/esm/core/src/shared-tests/test-update-with-null.spec.d.ts +0 -1
  164. package/esm/core/src/shared-tests/test-update-with-null.spec.js +0 -31
  165. package/esm/core/src/sort.d.ts +0 -16
  166. package/esm/core/src/sort.js +0 -103
  167. package/esm/core/src/sql-command.d.ts +0 -19
  168. package/esm/core/src/sql-command.js +0 -1
  169. package/esm/core/src/test.d.ts +0 -3
  170. package/esm/core/src/test.js +0 -12
  171. package/esm/core/src/tests/Done.d.ts +0 -5
  172. package/esm/core/src/tests/Done.js +0 -9
  173. package/esm/core/src/tests/RowProvider.spec.d.ts +0 -16
  174. package/esm/core/src/tests/RowProvider.spec.js +0 -631
  175. package/esm/core/src/tests/TestDataApiResponse.d.ts +0 -10
  176. package/esm/core/src/tests/TestDataApiResponse.js +0 -22
  177. package/esm/core/src/tests/basicRowFunctionality.spec.d.ts +0 -8
  178. package/esm/core/src/tests/basicRowFunctionality.spec.js +0 -2103
  179. package/esm/core/src/tests/c.d.ts +0 -8
  180. package/esm/core/src/tests/c.js +0 -13
  181. package/esm/core/src/tests/createData.d.ts +0 -7
  182. package/esm/core/src/tests/createData.js +0 -22
  183. package/esm/core/src/tests/d.d.ts +0 -6
  184. package/esm/core/src/tests/d.js +0 -11
  185. package/esm/core/src/tests/dWithPrefilter.d.ts +0 -7
  186. package/esm/core/src/tests/dWithPrefilter.js +0 -18
  187. package/esm/core/src/tests/entityForCustomFilter.d.ts +0 -16
  188. package/esm/core/src/tests/entityForCustomFilter.js +0 -33
  189. package/esm/core/src/tests/entityWithValidationsOnColumn.d.ts +0 -5
  190. package/esm/core/src/tests/entityWithValidationsOnColumn.js +0 -13
  191. package/esm/core/src/tests/frontend-database-tests-setup.spec.d.ts +0 -4
  192. package/esm/core/src/tests/frontend-database-tests-setup.spec.js +0 -37
  193. package/esm/core/src/tests/h.d.ts +0 -6
  194. package/esm/core/src/tests/h.js +0 -24
  195. package/esm/core/src/tests/remult-3-basic-tests.spec.d.ts +0 -1
  196. package/esm/core/src/tests/remult-3-basic-tests.spec.js +0 -236
  197. package/esm/core/src/tests/remult-3-entities.d.ts +0 -23
  198. package/esm/core/src/tests/remult-3-entities.js +0 -39
  199. package/esm/core/src/tests/tasks.d.ts +0 -6
  200. package/esm/core/src/tests/tasks.js +0 -10
  201. package/esm/core/src/tests/test-context-as-storage.spec.d.ts +0 -0
  202. package/esm/core/src/tests/test-context-as-storage.spec.js +0 -1
  203. package/esm/core/src/tests/test-data-api/predefined-filter.spec.d.ts +0 -1
  204. package/esm/core/src/tests/test-data-api/predefined-filter.spec.js +0 -389
  205. package/esm/core/src/tests/test-data-api/test-put-with-validation.spec.d.ts +0 -5
  206. package/esm/core/src/tests/test-data-api/test-put-with-validation.spec.js +0 -152
  207. package/esm/core/src/tests/test-decorator-precedence.spec.d.ts +0 -1
  208. package/esm/core/src/tests/test-decorator-precedence.spec.js +0 -38
  209. package/esm/core/src/tests/test-default-value.spec.d.ts +0 -1
  210. package/esm/core/src/tests/test-default-value.spec.js +0 -33
  211. package/esm/core/src/tests/test-entity-inheritance.spec.d.ts +0 -14
  212. package/esm/core/src/tests/test-entity-inheritance.spec.js +0 -82
  213. package/esm/core/src/tests/test-exceptions.spec.d.ts +0 -1
  214. package/esm/core/src/tests/test-exceptions.spec.js +0 -375
  215. package/esm/core/src/tests/test-json.spec.d.ts +0 -1
  216. package/esm/core/src/tests/test-json.spec.js +0 -115
  217. package/esm/core/src/tests/test-many-to-one-relation-in-entity.spec.d.ts +0 -9
  218. package/esm/core/src/tests/test-many-to-one-relation-in-entity.spec.js +0 -809
  219. package/esm/core/src/tests/test-non-active-record.spec.d.ts +0 -1
  220. package/esm/core/src/tests/test-non-active-record.spec.js +0 -66
  221. package/esm/core/src/tests/test-object-column.spec.d.ts +0 -1
  222. package/esm/core/src/tests/test-object-column.spec.js +0 -189
  223. package/esm/core/src/tests/test-paged-foreach.spec.d.ts +0 -1
  224. package/esm/core/src/tests/test-paged-foreach.spec.js +0 -328
  225. package/esm/core/src/tests/test-remult-angular.spec.d.ts +0 -1
  226. package/esm/core/src/tests/test-remult-angular.spec.js +0 -23
  227. package/esm/core/src/tests/test-server-controller.spec.d.ts +0 -7
  228. package/esm/core/src/tests/test-server-controller.spec.js +0 -489
  229. package/esm/core/src/tests/test-server-expressions.spec.d.ts +0 -1
  230. package/esm/core/src/tests/test-server-expressions.spec.js +0 -178
  231. package/esm/core/src/tests/test-server-method-on-entity.spec.d.ts +0 -1
  232. package/esm/core/src/tests/test-server-method-on-entity.spec.js +0 -306
  233. package/esm/core/src/tests/test-sql-expression.spec.d.ts +0 -5
  234. package/esm/core/src/tests/test-sql-expression.spec.js +0 -205
  235. package/esm/core/src/tests/test-sql.spec.d.ts +0 -1
  236. package/esm/core/src/tests/test-sql.spec.js +0 -170
  237. package/esm/core/src/tests/test-subscribe.spec.d.ts +0 -1
  238. package/esm/core/src/tests/test-subscribe.spec.js +0 -135
  239. package/esm/core/src/tests/test-type-recovery.spec.d.ts +0 -1
  240. package/esm/core/src/tests/test-type-recovery.spec.js +0 -49
  241. package/esm/core/src/tests/test-where-api.spec.d.ts +0 -1
  242. package/esm/core/src/tests/test-where-api.spec.js +0 -434
  243. package/esm/core/src/tests/testHelper.spec.d.ts +0 -36
  244. package/esm/core/src/tests/testHelper.spec.js +0 -226
  245. package/esm/core/src/tests/testModel/models.d.ts +0 -16
  246. package/esm/core/src/tests/testModel/models.js +0 -25
  247. package/esm/core/src/validators.d.ts +0 -14
  248. package/esm/core/src/validators.js +0 -33
  249. package/esm/core/src/valueConverters.js +0 -197
  250. package/esm/core/urlBuilder.d.ts +0 -6
  251. package/esm/core/urlBuilder.js +0 -20
  252. package/esm/test-servers/shared/Task.d.ts +0 -9
  253. package/esm/test-servers/shared/Task.js +0 -32
  254. package/esm/test.d.ts +0 -5
  255. package/esm/test.js +0 -6
@@ -1,6 +0,0 @@
1
- import { RemultServer, RemultServerOptions, ServerCoreOptions } from './expressBridge';
2
- export { queuedJobInfo, QueueStorage, GenericRequestInfo, GenericRequestHandler, RemultServerCore, GenericResponse, GenericRouter, RemultServerOptions, SpecificRoute, RemultServer, InitRequestOptions } from './expressBridge';
3
- export { JsonEntityFileStorage, JsonFileDataProvider } from './JsonEntityFileStorage';
4
- export { DataProviderLiveQueryStorage } from '../live-query/data-provider-live-query-storage';
5
- export { SseSubscriptionServer } from '../SseSubscriptionServer';
6
- export declare function createRemultServer<RequestType>(options: RemultServerOptions<RequestType>, serverCoreOptions?: ServerCoreOptions<RequestType>): RemultServer<RequestType>;
@@ -1,9 +0,0 @@
1
- import { createRemultServerCore, } from './expressBridge';
2
- import { initAsyncHooks } from './initAsyncHooks';
3
- export { JsonEntityFileStorage, JsonFileDataProvider } from './JsonEntityFileStorage';
4
- export { DataProviderLiveQueryStorage } from '../live-query/data-provider-live-query-storage';
5
- export { SseSubscriptionServer } from '../SseSubscriptionServer';
6
- export function createRemultServer(options, serverCoreOptions) {
7
- initAsyncHooks();
8
- return createRemultServerCore(options, serverCoreOptions || { buildGenericRequestInfo: req => req, getRequestBody: async (req) => req.body });
9
- }
@@ -1 +0,0 @@
1
- export declare function initAsyncHooks(): void;
@@ -1,9 +0,0 @@
1
- import { AsyncLocalStorage } from 'async_hooks';
2
- import { RemultAsyncLocalStorage } from '../src/context';
3
- let init = false;
4
- export function initAsyncHooks() {
5
- if (init)
6
- return;
7
- init = true;
8
- RemultAsyncLocalStorage.instance = new RemultAsyncLocalStorage(new AsyncLocalStorage());
9
- }
@@ -1,2 +0,0 @@
1
- import { DataProvider } from '../src/data-interfaces';
2
- export declare function initDataProvider(optionsDataProvider?: DataProvider | Promise<DataProvider> | (() => Promise<DataProvider | undefined>)): Promise<DataProvider>;
@@ -1,14 +0,0 @@
1
- export function initDataProvider(optionsDataProvider) {
2
- let dataProvider;
3
- if (typeof optionsDataProvider === "function") {
4
- dataProvider = optionsDataProvider();
5
- }
6
- else
7
- dataProvider = Promise.resolve(optionsDataProvider);
8
- dataProvider = dataProvider.then(async (dp) => {
9
- if (dp)
10
- return dp;
11
- return new (await import('./JsonEntityFileStorage')).JsonFileDataProvider('./db');
12
- });
13
- return dataProvider;
14
- }
@@ -1,11 +0,0 @@
1
- export interface packedRowInfo {
2
- data: any;
3
- isNewRow: boolean;
4
- id: string;
5
- wasChanged: boolean;
6
- }
7
- export interface entityEventListener<entityType> {
8
- deleted?: (entity: entityType) => void;
9
- saved?: (entity: entityType, isNew: boolean) => void;
10
- validating?: (entity: entityType) => Promise<any> | any;
11
- }
@@ -1 +0,0 @@
1
- export {};
@@ -1,3 +0,0 @@
1
- export interface __RowsOfDataForTesting {
2
- rows: any;
3
- }
@@ -1 +0,0 @@
1
- export {};
@@ -1,6 +0,0 @@
1
- import { dbTestWhatSignature } from "../shared-tests/db-tests-setup";
2
- export declare const testKnexPGSqlImpl: (key: string, what: dbTestWhatSignature, focus?: boolean) => void;
3
- export declare const mySqlTest: import("../shared-tests/db-tests-setup").dbTestMethodSignature;
4
- export declare function testPostgresImplementation(key: string, what: dbTestWhatSignature, focus?: boolean): void;
5
- export declare function testMongo(key: string, what: dbTestWhatSignature, focus?: boolean): void;
6
- import '../shared-tests';
@@ -1,147 +0,0 @@
1
- import { Remult } from "../context";
2
- import { KnexDataProvider, KnexSchemaBuilder } from '../../remult-knex';
3
- import * as Knex from 'knex';
4
- import { MongoClient } from 'mongodb';
5
- import { config } from 'dotenv';
6
- import { createPostgresConnection, PostgresSchemaBuilder } from "../../postgres";
7
- import { addDatabaseToTest, itWithFocus, testAll, TestDbs } from "../shared-tests/db-tests-setup";
8
- import { describeClass } from "../remult3/DecoratorReplacer";
9
- import { Entity, Fields } from "../remult3";
10
- KnexSchemaBuilder.logToConsole = false;
11
- PostgresSchemaBuilder.logToConsole = false;
12
- config();
13
- function testKnexSqlImpl(knex, name) {
14
- return (key, what, focus = false) => {
15
- itWithFocus(key + " " + name + " - knex", async () => {
16
- let db = new KnexDataProvider(knex);
17
- let remult = new Remult(db);
18
- await what({
19
- db, remult,
20
- createEntity: async (entity) => {
21
- let repo = remult.repo(entity);
22
- await knex.schema.dropTableIfExists(await repo.metadata.getDbName());
23
- await db.ensureSchema([repo.metadata]);
24
- return repo;
25
- }
26
- });
27
- }, focus);
28
- };
29
- }
30
- export const testKnexPGSqlImpl = testKnexSqlImpl(Knex.default({
31
- client: 'pg',
32
- connection: process.env.DATABASE_URL,
33
- //debug:true
34
- }), "postgres");
35
- addDatabaseToTest(testKnexPGSqlImpl);
36
- if (process.env['TESTS_SQL_SERVER'])
37
- addDatabaseToTest(testKnexSqlImpl(Knex.default({
38
- client: 'mssql',
39
- connection: {
40
- server: '127.0.0.1',
41
- database: 'test2',
42
- user: 'sa',
43
- password: 'MASTERKEY',
44
- options: {
45
- enableArithAbort: true,
46
- encrypt: false,
47
- instanceName: 'sqlexpress'
48
- }
49
- } //,debug: true
50
- }), "sql server"));
51
- if (true)
52
- addDatabaseToTest(testKnexSqlImpl(Knex.default({
53
- client: 'better-sqlite3',
54
- connection: {
55
- filename: ":memory:"
56
- },
57
- //debug: true
58
- }), "sqlite3"));
59
- export const mySqlTest = addDatabaseToTest(testKnexSqlImpl(Knex.default({
60
- client: 'mysql2',
61
- connection: {
62
- user: 'root',
63
- password: 'MASTERKEY',
64
- host: '127.0.0.1',
65
- database: 'test'
66
- }
67
- //debug: true
68
- }), "mysql2"));
69
- let pg = createPostgresConnection();
70
- export function testPostgresImplementation(key, what, focus = false) {
71
- itWithFocus(key + " - postgres", async () => {
72
- let db = await pg;
73
- let remult = new Remult(db);
74
- await what({
75
- db, remult,
76
- createEntity: async (entity) => {
77
- let repo = remult.repo(entity);
78
- await db.execute("drop table if exists " + await repo.metadata.getDbName());
79
- await db.ensureSchema([repo.metadata]);
80
- return repo;
81
- }
82
- });
83
- }, focus);
84
- }
85
- addDatabaseToTest(testPostgresImplementation);
86
- import { Categories } from "../tests/remult-3-entities";
87
- import { MongoDataProvider } from "../../remult-mongo";
88
- testAll("transactions", async ({ db, createEntity }) => {
89
- let x = await createEntity(Categories);
90
- await db.transaction(async (db) => {
91
- let remult = new Remult(db);
92
- expect(await remult.repo(Categories).count()).toBe(0);
93
- });
94
- });
95
- const mongoConnectionString = process.env['MONGO_TEST_URL']; //"mongodb://localhost:27017/local"
96
- let client = new MongoClient(mongoConnectionString);
97
- let done;
98
- let mongoDbPromise = client.connect().then(c => {
99
- done = c;
100
- return c.db("test");
101
- });
102
- afterAll(async () => {
103
- if (done)
104
- done.close();
105
- });
106
- export function testMongo(key, what, focus = false) {
107
- itWithFocus(key + " - mongo", async () => {
108
- let mongoDb = await mongoDbPromise;
109
- let db = new MongoDataProvider(mongoDb, client);
110
- let remult = new Remult(db);
111
- await what({
112
- db, remult,
113
- createEntity: async (entity) => {
114
- let repo = remult.repo(entity);
115
- await mongoDb.collection(await repo.metadata.getDbName()).deleteMany({});
116
- return repo;
117
- }
118
- });
119
- }, focus);
120
- }
121
- addDatabaseToTest(testMongo, TestDbs.mongo);
122
- it("test mongo without transaction", async () => {
123
- const client = new MongoClient("mongodb://localhost:27017/local");
124
- await client.connect();
125
- const mongoDb = client.db('test');
126
- const db = new MongoDataProvider(mongoDb, client, { disableTransactions: true });
127
- var remult = new Remult(db);
128
- const entity = class {
129
- id = 0;
130
- title = '';
131
- };
132
- describeClass(entity, Entity("testNoTrans"), { id: Fields.number(), title: Fields.string() });
133
- const repo = remult.repo(entity);
134
- for (const item of await repo.find()) {
135
- await repo.delete(item);
136
- }
137
- await repo.insert({ id: 1, title: "a" });
138
- try {
139
- await db.transaction(async () => {
140
- await repo.insert({ id: 2, title: "b" });
141
- throw new Error();
142
- });
143
- }
144
- catch { }
145
- expect(await repo.count()).toBe(2);
146
- });
147
- import '../shared-tests';
@@ -1,197 +0,0 @@
1
- import { Remult } from "../context";
2
- import { Entity, Fields } from "../remult3";
3
- import { KnexDataProvider } from '../../remult-knex';
4
- import { config } from 'dotenv';
5
- import { testKnexPGSqlImpl, testMongo, testPostgresImplementation } from "./backend-database-test-setup.backend-spec";
6
- import { entityWithValidations } from "../shared-tests/entityWithValidations";
7
- import { PostgresDataProvider } from "../../postgres";
8
- import { MongoDataProvider } from "../../remult-mongo";
9
- import { SqlDatabase } from "../data-providers/sql-database";
10
- import { dbNamesOf } from "../filter/filter-consumer-bridge-to-sql-request";
11
- import { RemultAsyncLocalStorage } from "../../src/context";
12
- import { remult } from "../remult-proxy";
13
- import { describeClass } from "../remult3/DecoratorReplacer";
14
- import { AsyncLocalStorage } from "async_hooks";
15
- config();
16
- testPostgresImplementation("default order by", async ({ createEntity }) => {
17
- let s = await entityWithValidations.create4RowsInDp(createEntity);
18
- await s.update(1, { name: "updated name" });
19
- expect((await s.find()).map(x => x.myId)).toEqual([1, 2, 3, 4]);
20
- }, false);
21
- testKnexPGSqlImpl("default order by", async ({ createEntity }) => {
22
- let s = await entityWithValidations.create4RowsInDp(createEntity);
23
- await s.update(1, { name: "updated name" });
24
- expect((await s.find()).map(x => x.myId)).toEqual([1, 2, 3, 4]);
25
- }, false);
26
- testPostgresImplementation("sql filter", async ({ createEntity }) => {
27
- let s = await entityWithValidations.create4RowsInDp(createEntity);
28
- expect((await s.find({
29
- where: SqlDatabase.rawFilter(async (build) => {
30
- build.sql = s.metadata.fields.myId.options.dbName + ' in (1,3)';
31
- })
32
- })).length).toBe(2);
33
- }, false);
34
- testPostgresImplementation("sql filter2", async ({ createEntity }) => {
35
- let s = await entityWithValidations.create4RowsInDp(createEntity);
36
- expect((await s.find({
37
- where: {
38
- $or: [
39
- SqlDatabase.rawFilter(async (build) => {
40
- build.sql = s.metadata.fields.myId.options.dbName + ' in (1,3)';
41
- }),
42
- {
43
- myId: 2
44
- }
45
- ]
46
- }
47
- })).length).toBe(3);
48
- }, false);
49
- testKnexPGSqlImpl("knex filter", async ({ createEntity }) => {
50
- let s = await entityWithValidations.create4RowsInDp(createEntity);
51
- expect((await s.find({
52
- where: KnexDataProvider.rawFilter(async () => {
53
- return build => build.whereIn(s.metadata.fields.myId.options.dbName, [1, 3]);
54
- })
55
- })).length).toBe(2);
56
- }, false);
57
- testKnexPGSqlImpl("knex filter2", async ({ createEntity }) => {
58
- let s = await entityWithValidations.create4RowsInDp(createEntity);
59
- expect((await s.find({
60
- where: {
61
- $or: [KnexDataProvider.rawFilter(async () => {
62
- return build => build.whereIn(s.metadata.fields.myId.options.dbName, [1, 3]);
63
- }), {
64
- myId: 4
65
- }]
66
- }
67
- })).length).toBe(3);
68
- }, false);
69
- testPostgresImplementation("ensure schema with dbNames that have quotes", async ({ remult }) => {
70
- const db = SqlDatabase.getDb(remult);
71
- const entityName = 'test_naming';
72
- await db.execute("Drop table if exists " + entityName);
73
- await db.execute(`create table ${entityName}(id int,"createdAt" Date)`);
74
- const ent = class {
75
- id = 0;
76
- createdAt = new Date();
77
- oneMoreColumn = 0;
78
- };
79
- describeClass(ent, Entity(entityName), {
80
- id: Fields.integer(),
81
- createdAt: Fields.createdAt({ dbName: '"createdAt"' }),
82
- oneMoreColumn: Fields.integer()
83
- });
84
- await db.ensureSchema([remult.repo(ent).metadata]);
85
- await remult.repo(ent).insert({ id: 1, oneMoreColumn: 8 });
86
- expect((await remult.repo(ent).findFirst()).createdAt.getFullYear()).toBe(new Date().getFullYear());
87
- }, false);
88
- testPostgresImplementation("work with native sql", async ({ remult, createEntity }) => {
89
- const repo = await entityWithValidations.create4RowsInDp(createEntity);
90
- const sql = SqlDatabase.getDb(remult);
91
- const r = await sql.execute("select count(*) as c from " + repo.metadata.options.dbName);
92
- expect(r.rows[0].c).toBe('4');
93
- }, false);
94
- testPostgresImplementation("work with native sql2", async ({ remult, createEntity }) => {
95
- const repo = await entityWithValidations.create4RowsInDp(createEntity);
96
- const sql = PostgresDataProvider.getDb(remult);
97
- const r = await sql.query("select count(*) as c from " + repo.metadata.options.dbName);
98
- expect(r.rows[0].c).toBe('4');
99
- }, false);
100
- testPostgresImplementation("work with native sql3", async ({ remult, createEntity }) => {
101
- const repo = await entityWithValidations.create4RowsInDp(createEntity);
102
- await SqlDatabase.getDb(remult)._getSourceSql().transaction(async (x) => {
103
- const sql = PostgresDataProvider.getDb(new Remult(new SqlDatabase(x)));
104
- const r = await sql.query("select count(*) as c from " + repo.metadata.options.dbName);
105
- expect(r.rows[0].c).toBe('4');
106
- });
107
- }, false);
108
- testKnexPGSqlImpl("work with native knex", async ({ remult, createEntity }) => {
109
- const repo = await entityWithValidations.create4RowsInDp(createEntity);
110
- const knex = KnexDataProvider.getDb(remult);
111
- const r = await knex(repo.metadata.options.dbName).count();
112
- expect(r[0].count).toBe('4');
113
- }, false);
114
- testKnexPGSqlImpl("work with native knex2", async ({ remult, createEntity }) => {
115
- const repo = await entityWithValidations.create4RowsInDp(createEntity);
116
- await (remult.dataProvider).transaction(async (db) => {
117
- const sql = KnexDataProvider.getDb(new Remult(db));
118
- const r = await sql(repo.metadata.options.dbName).count();
119
- expect(r[0].count).toBe('4');
120
- });
121
- }, false);
122
- testKnexPGSqlImpl("work with native knex3", async ({ remult, createEntity }) => {
123
- const repo = await entityWithValidations.create4RowsInDp(createEntity);
124
- const knex = KnexDataProvider.getDb(remult);
125
- const t = await dbNamesOf(repo);
126
- const r = await knex((await t).$entityName).select(t.myId, t.name);
127
- expect(r.length).toBe(4);
128
- }, false);
129
- testMongo("work with native mongo", async ({ remult, createEntity }) => {
130
- const repo = await entityWithValidations.create4RowsInDp(createEntity);
131
- const mongo = MongoDataProvider.getDb(remult);
132
- const r = await (await mongo.db.collection(repo.metadata.options.dbName)).countDocuments();
133
- expect(r).toBe(4);
134
- }, false);
135
- testKnexPGSqlImpl("knex with filter", async ({ remult, createEntity }) => {
136
- const repo = await entityWithValidations.create4RowsInDp(createEntity);
137
- const knex = KnexDataProvider.getDb(remult);
138
- const e = await dbNamesOf(repo);
139
- const r = await knex(e.$entityName).count().where(await KnexDataProvider.filterToRaw(repo, { myId: [1, 3] }));
140
- expect(r[0].count).toBe('2');
141
- }, false);
142
- testMongo("work with native mongo and condition", async ({ remult, createEntity }) => {
143
- const repo = await entityWithValidations.create4RowsInDp(createEntity);
144
- const mongo = MongoDataProvider.getDb(remult);
145
- const r = await (await mongo.db.collection(repo.metadata.options.dbName)).countDocuments(await MongoDataProvider.filterToRaw(repo, { myId: [1, 2] }));
146
- expect(r).toBe(2);
147
- }, false);
148
- it("test async hooks and static remult", async () => {
149
- let gotException = true;
150
- try {
151
- RemultAsyncLocalStorage.instance.getRemult();
152
- gotException = false;
153
- }
154
- catch { }
155
- expect(gotException).toBe(true);
156
- RemultAsyncLocalStorage.instance = new RemultAsyncLocalStorage(new AsyncLocalStorage());
157
- try {
158
- expect(RemultAsyncLocalStorage.instance.getRemult()).toBe(undefined);
159
- RemultAsyncLocalStorage.enable();
160
- try {
161
- remult.isAllowed(false);
162
- gotException = false;
163
- }
164
- catch { }
165
- expect(gotException).toBe(true);
166
- const promises = [];
167
- RemultAsyncLocalStorage.instance.run(new Remult(), () => {
168
- remult.user = { id: 'noam' };
169
- promises.push(new Promise(res => {
170
- setTimeout(() => {
171
- expect(remult.user.id).toBe('noam');
172
- res({});
173
- }, 10);
174
- }));
175
- RemultAsyncLocalStorage.instance.run(new Remult(), () => {
176
- remult.user = { id: 'yoni' };
177
- promises.push(new Promise(res => {
178
- setTimeout(() => {
179
- expect(remult.user.id).toBe('yoni');
180
- res({});
181
- }, 10);
182
- }));
183
- });
184
- promises.push(new Promise(res => {
185
- setTimeout(() => {
186
- expect(remult.user.id).toBe('noam');
187
- res({});
188
- }, 10);
189
- }));
190
- });
191
- await Promise.all(promises);
192
- }
193
- finally {
194
- RemultAsyncLocalStorage.disable();
195
- RemultAsyncLocalStorage.instance = new RemultAsyncLocalStorage(undefined);
196
- }
197
- });
@@ -1,167 +0,0 @@
1
- import axios from 'axios';
2
- import { remult } from '../remult-proxy';
3
- import { Categories } from '../tests/remult-3-entities';
4
- import { Task } from '../../../test-servers/shared/Task';
5
- import { remultFresh } from '../../remult-fresh';
6
- import { InMemoryDataProvider } from '../data-providers/in-memory-database';
7
- import { RemultAsyncLocalStorage } from '../context';
8
- const servers = {
9
- koa: "koa",
10
- fastify: "fastify",
11
- express: "express",
12
- mw: "mw",
13
- fresh: "fresh",
14
- mwc: "mwc",
15
- svelteKit: 'svelteKit',
16
- nextApp: "nextApp"
17
- };
18
- remult.apiClient.url = 'http://localhost:3003/api';
19
- let path = remult.apiClient.url + '/tasks';
20
- const environments = [
21
- // ["optine", 3006],
22
- //["nest", 3001],
23
- // ["next", 3000],
24
- // [servers.nextApp, 3010],
25
- // [servers.koa, 3002],
26
- // [servers.fastify, 3003],
27
- // [servers.express, 3004],
28
- // [servers.mw, 3005],
29
- // [servers.mwc, 3007],
30
- // [servers.fresh, 8000],
31
- // [servers.svelteKit, 5173],
32
- ];
33
- function test(name, test, ...ignoreList) {
34
- for (const [env, port] of environments) {
35
- if (ignoreList?.includes(env))
36
- continue;
37
- const theTest = async () => {
38
- remult.apiClient.url = `http://localhost:${port}/api`;
39
- path = remult.apiClient.url + '/tasks';
40
- await test();
41
- };
42
- const testName = env + ` ${port}: ${name}`;
43
- fit(testName, theTest);
44
- }
45
- }
46
- test("works", async () => {
47
- const repo = await create3Tasks();
48
- const tasks = await repo.find({ where: { completed: true } });
49
- expect(tasks.length).toBe(1);
50
- await repo.save({ ...tasks[0], completed: false });
51
- expect(await repo.count({ completed: true })).toBe(0);
52
- });
53
- test("test multiple items", async () => {
54
- const repo = await create3Tasks();
55
- expect(await repo.count({
56
- title: { "!=": ["a", "c"] }
57
- })).toBe(1);
58
- });
59
- test("validation", async () => {
60
- const r = await create3Tasks();
61
- let err = undefined;
62
- try {
63
- await r.insert({ "title": "" });
64
- }
65
- catch (error) {
66
- err = error;
67
- }
68
- expect(err).toEqual({
69
- message: "Title: Should not be empty",
70
- httpStatusCode: 400,
71
- modelState: {
72
- title: "Should not be empty"
73
- }
74
- });
75
- });
76
- test("forbidden", async () => {
77
- let err = undefined;
78
- try {
79
- await Task.testForbidden();
80
- }
81
- catch (error) {
82
- err = error;
83
- }
84
- expect(err.httpStatusCode).toEqual(403);
85
- });
86
- test("test static remult", async () => {
87
- const r = await create3Tasks();
88
- expect(await Task.testStaticRemult()).toBe(3);
89
- }, servers.fresh, servers.mwc);
90
- test("test injected remult", async () => {
91
- const r = await create3Tasks();
92
- expect(await Task.testInjectedRemult()).toBe(3);
93
- });
94
- test("test http 404", async () => {
95
- const repo = create3Tasks();
96
- const task = await (await repo).findFirst();
97
- let result = await axios.get(path + "/" + task.id);
98
- expect(result.data.id).toBe(task.id);
99
- expect(result.status).toBe(200);
100
- let error = undefined;
101
- try {
102
- result = await axios.get(path + "/123");
103
- }
104
- catch (err) {
105
- error = err;
106
- }
107
- expect(error.response.status).toBe(404);
108
- });
109
- test("test http 201", async () => {
110
- let result = await axios.post(path, { title: "z", id: "" });
111
- expect(result.data.title).toBe("z");
112
- expect(result.status).toBe(201);
113
- result = await axios.delete(path + "/" + result.data.id);
114
- expect(result.status).toBe(204);
115
- });
116
- test("test regular api call", async () => {
117
- await create3Tasks();
118
- let result = await axios.get(remult.apiClient.url + "/test");
119
- expect(result.data.result).toBe(3);
120
- });
121
- class FreshResponseTest {
122
- body;
123
- init;
124
- constructor(body, init) {
125
- this.body = body;
126
- this.init = init;
127
- }
128
- static json(data, init) {
129
- return new this(data, init);
130
- }
131
- }
132
- it("test fresh", async () => {
133
- try {
134
- const api = remultFresh({
135
- entities: [Categories],
136
- dataProvider: new InMemoryDataProvider(),
137
- rootPath: '/api',
138
- logApiEndPoints: false
139
- }, FreshResponseTest);
140
- const r = await api.handle({
141
- url: '/api/Categories',
142
- json() {
143
- return undefined;
144
- },
145
- method: "get"
146
- }, {
147
- next() {
148
- return undefined;
149
- },
150
- });
151
- expect(r.body).toEqual([]);
152
- }
153
- finally {
154
- RemultAsyncLocalStorage.disable();
155
- }
156
- });
157
- async function create3Tasks() {
158
- remult.apiClient.httpClient = axios;
159
- const taskRepo = remult.repo(Task);
160
- for (const task of await taskRepo.find()) {
161
- await taskRepo.delete(task);
162
- }
163
- expect(await taskRepo.count()).toBe(0);
164
- await taskRepo.insert([{ title: "a" }, { title: "b", completed: true }, { title: "c" }]);
165
- expect(await taskRepo.count()).toBe(3);
166
- return taskRepo;
167
- }
@@ -1,31 +0,0 @@
1
- import { RestDataProviderHttpProvider } from "./data-interfaces";
2
- import { RestDataProviderHttpProviderUsingFetch } from './data-providers/rest-data-provider';
3
- export declare function buildRestDataProvider(provider: ExternalHttpProvider | typeof fetch): RestDataProviderHttpProviderUsingFetch | RestDataProviderHttpProvider;
4
- export declare function isExternalHttpProvider(item: any): boolean;
5
- export declare class HttpProviderBridgeToRestDataProviderHttpProvider implements RestDataProviderHttpProvider {
6
- private http;
7
- constructor(http: ExternalHttpProvider);
8
- post(url: string, data: any): Promise<any>;
9
- delete(url: string): Promise<void>;
10
- put(url: string, data: any): Promise<any>;
11
- get(url: string): Promise<any>;
12
- }
13
- export declare function retry<T>(what: () => Promise<T>): Promise<T>;
14
- export declare function toPromise<T>(p: Promise<T> | {
15
- toPromise(): Promise<T>;
16
- }): Promise<any>;
17
- export declare function processHttpException(ex: any): Promise<any>;
18
- export interface ExternalHttpProvider {
19
- post(url: string, data: any): Promise<any> | {
20
- toPromise(): Promise<any>;
21
- };
22
- delete(url: string): Promise<void> | {
23
- toPromise(): Promise<void>;
24
- };
25
- put(url: string, data: any): Promise<any> | {
26
- toPromise(): Promise<any>;
27
- };
28
- get(url: string): Promise<any> | {
29
- toPromise(): Promise<any>;
30
- };
31
- }