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,29 +0,0 @@
1
- import { createRemultServerCore } from "./server/expressBridge";
2
- export function remultFresh(options, response) {
3
- const server = createRemultServerCore(options, {
4
- buildGenericRequestInfo: r => r,
5
- getRequestBody: req => req.json()
6
- });
7
- return {
8
- getRemult: r => server.getRemult(r),
9
- openApiDoc: x => server.openApiDoc(x),
10
- handle: async (req, ctx) => {
11
- let init = {};
12
- const res = await server.handle(req);
13
- if (res) {
14
- init.status = res.statusCode;
15
- if (res.data) {
16
- return response.json(res.data, init);
17
- }
18
- else
19
- return new response(undefined, init);
20
- }
21
- else {
22
- return ctx.next();
23
- }
24
- ;
25
- },
26
- };
27
- }
28
- ;
29
- ;
@@ -1,30 +0,0 @@
1
- import type { Knex } from 'knex';
2
- import { Remult } from "../src/context";
3
- import { EntityFilter, EntityMetadata, RepositoryOverloads } from "../src/remult3";
4
- import { DataProvider, EntityDataProvider } from '../src/data-interfaces';
5
- import { FieldMetadata } from '../src/column-interfaces';
6
- export declare class KnexDataProvider implements DataProvider {
7
- knex: Knex;
8
- constructor(knex: Knex);
9
- static getDb(remult?: Remult): Knex<any, any[]>;
10
- getEntityDataProvider(entity: EntityMetadata<any>): EntityDataProvider;
11
- transaction(action: (dataProvider: DataProvider) => Promise<void>): Promise<void>;
12
- static rawFilter(build: CustomKnexFilterBuilderFunction): EntityFilter<any>;
13
- static filterToRaw<entityType>(entity: RepositoryOverloads<entityType>, condition: EntityFilter<entityType>): Promise<(knex: any) => void>;
14
- isProxy?: boolean;
15
- ensureSchema(entities: EntityMetadata<any>[]): Promise<void>;
16
- }
17
- export type CustomKnexFilterBuilderFunction = () => Promise<(builder: Knex.QueryBuilder) => void>;
18
- export declare class KnexSchemaBuilder {
19
- private knex;
20
- static logToConsole: boolean;
21
- verifyStructureOfAllEntities(remult?: Remult): Promise<void>;
22
- ensureSchema(entities: EntityMetadata<any>[]): Promise<void>;
23
- createIfNotExist(entity: EntityMetadata): Promise<void>;
24
- addColumnIfNotExist<T extends EntityMetadata>(entity: T, c: ((e: T) => FieldMetadata)): Promise<void>;
25
- verifyAllColumns<T extends EntityMetadata>(entity: T): Promise<void>;
26
- additionalWhere: string;
27
- constructor(knex: Knex);
28
- }
29
- export declare function buildColumn(x: FieldMetadata, dbName: string, b: Knex.CreateTableBuilder, supportsJson?: boolean): void;
30
- export declare function createKnexDataProvider(config: Knex.Config): Promise<KnexDataProvider>;
@@ -1,446 +0,0 @@
1
- import { customDatabaseFilterToken, Filter } from "../src/filter/filter-interfaces";
2
- import { dbNamesOf, isDbReadonly } from "../src/filter/filter-consumer-bridge-to-sql-request";
3
- import { allEntities } from "../src/context";
4
- import { isAutoIncrement, getRepository } from "../src/remult3";
5
- import { ValueConverters } from "../src/valueConverters";
6
- import { CompoundIdField } from '../src/column';
7
- import { Sort } from '../src/sort';
8
- import { remult as remultContext } from '../src/remult-proxy';
9
- export class KnexDataProvider {
10
- knex;
11
- constructor(knex) {
12
- this.knex = knex;
13
- }
14
- static getDb(remult) {
15
- const r = (remult || remultContext).dataProvider;
16
- if (!r.knex)
17
- throw "the data provider is not an KnexDataProvider";
18
- return r.knex;
19
- }
20
- getEntityDataProvider(entity) {
21
- if (!supportsJson(this.knex))
22
- for (const f of entity.fields.toArray()) {
23
- if (f.valueConverter.fieldTypeInDb === "json") {
24
- //@ts-ignore
25
- f.valueConverter = { ...f.valueConverter, toDb: ValueConverters.JsonString.toDb, fromDb: ValueConverters.JsonString.fromDb };
26
- }
27
- }
28
- return new KnexEntityDataProvider(entity, this.knex);
29
- }
30
- async transaction(action) {
31
- let t = await this.knex.transaction();
32
- try {
33
- await action(new KnexDataProvider(t));
34
- await t.commit();
35
- }
36
- catch (err) {
37
- await t.rollback();
38
- throw err;
39
- }
40
- }
41
- static rawFilter(build) {
42
- return {
43
- [customDatabaseFilterToken]: {
44
- buildKnex: build
45
- }
46
- };
47
- }
48
- static async filterToRaw(entity, condition) {
49
- const repo = getRepository(entity);
50
- var b = new FilterConsumerBridgeToKnexRequest(await dbNamesOf(repo.metadata));
51
- b._addWhere = false;
52
- await (await (repo.translateWhereToFilter(condition))).__applyToConsumer(b);
53
- let r = await b.resolveWhere();
54
- return knex => r.forEach(y => y(knex));
55
- }
56
- isProxy;
57
- async ensureSchema(entities) {
58
- var sb = new KnexSchemaBuilder(this.knex);
59
- await sb.ensureSchema(entities);
60
- }
61
- }
62
- class KnexEntityDataProvider {
63
- entity;
64
- knex;
65
- constructor(entity, knex) {
66
- this.entity = entity;
67
- this.knex = knex;
68
- }
69
- async count(where) {
70
- const e = await this.init();
71
- const br = new FilterConsumerBridgeToKnexRequest(e);
72
- where.__applyToConsumer(br);
73
- let r = await br.resolveWhere();
74
- const result = (await this.knex(e.$entityName)
75
- .count().where(b => r.forEach(w => w(b))));
76
- var row = result[0];
77
- for (const key in row) {
78
- if (Object.prototype.hasOwnProperty.call(row, key)) {
79
- const element = row[key];
80
- return +element;
81
- }
82
- }
83
- }
84
- async find(options) {
85
- const e = await this.init();
86
- let cols = [];
87
- let colKeys = [];
88
- for (const x of this.entity.fields) {
89
- if (x.isServerExpression) {
90
- }
91
- else {
92
- cols.push(e.$dbNameOf(x));
93
- colKeys.push(x);
94
- }
95
- }
96
- let query = this.knex(e.$entityName).select(cols);
97
- if (options?.where) {
98
- const br = new FilterConsumerBridgeToKnexRequest(e);
99
- options.where.__applyToConsumer(br);
100
- let r = await br.resolveWhere();
101
- query.where(b => r.forEach(y => y(b)));
102
- }
103
- if (!options.orderBy) {
104
- options.orderBy = Sort.createUniqueSort(this.entity, new Sort());
105
- }
106
- if (options.orderBy) {
107
- query = query.orderBy(options.orderBy.Segments.map(s => ({
108
- column: e.$dbNameOf(s.field),
109
- order: s.isDescending ? "desc" : "asc"
110
- })));
111
- }
112
- if (options.limit) {
113
- query = query.limit(options.limit);
114
- if (options.page)
115
- query = query.offset((options.page - 1) * options.limit);
116
- }
117
- const r = await query;
118
- return r.map(y => {
119
- let result = {};
120
- let i = 0;
121
- for (let m in y) {
122
- let field = colKeys[i++];
123
- try {
124
- result[field.key] = field.valueConverter.fromDb(y[m]);
125
- }
126
- catch (err) {
127
- throw new Error("Failed to load from db:" + field.key + "\r\n" + err);
128
- }
129
- }
130
- return result;
131
- });
132
- }
133
- async init() {
134
- return await dbNamesOf(this.entity);
135
- }
136
- async update(id, data) {
137
- const e = await this.init();
138
- let f = new FilterConsumerBridgeToKnexRequest(e);
139
- Filter.fromEntityFilter(this.entity, this.entity.idMetadata.getIdFilter(id)).__applyToConsumer(f);
140
- let resultFilter = this.entity.idMetadata.getIdFilter(id);
141
- if (data.id != undefined)
142
- resultFilter = this.entity.idMetadata.getIdFilter(data.id);
143
- let updateObject = {};
144
- for (const x of this.entity.fields) {
145
- if (isDbReadonly(x, e)) { }
146
- else if (data[x.key] !== undefined) {
147
- let v = translateValueAndHandleArrayAndHandleArray(x, data[x.key]);
148
- if (v !== undefined) {
149
- let key = await e.$dbNameOf(x);
150
- updateObject[key] = v;
151
- }
152
- }
153
- }
154
- let where = await f.resolveWhere();
155
- await this.knex(e.$entityName).update(updateObject).where(b => where.forEach(w => w(b)));
156
- return this.find({ where: Filter.fromEntityFilter(this.entity, resultFilter) }).then(y => y[0]);
157
- }
158
- async delete(id) {
159
- const e = await this.init();
160
- let f = new FilterConsumerBridgeToKnexRequest(e);
161
- Filter.fromEntityFilter(this.entity, this.entity.idMetadata.getIdFilter(id)).__applyToConsumer(f);
162
- let where = await f.resolveWhere();
163
- await this.knex(e.$entityName).delete().where(b => where.forEach(w => w(b)));
164
- }
165
- async insert(data) {
166
- const e = await this.init();
167
- let resultFilter;
168
- if (this.entity.idMetadata.field instanceof CompoundIdField)
169
- resultFilter = this.entity.idMetadata.field.resultIdFilter(undefined, data);
170
- else
171
- resultFilter = Filter.fromEntityFilter(this.entity, this.entity.idMetadata.getIdFilter(data[this.entity.idMetadata.field.key]));
172
- let insertObject = {};
173
- for (const x of this.entity.fields) {
174
- if (isDbReadonly(x, e)) { }
175
- else {
176
- let v = translateValueAndHandleArrayAndHandleArray(x, data[x.key]);
177
- if (v != undefined) {
178
- let key = await e.$dbNameOf(x);
179
- insertObject[key] = v;
180
- }
181
- }
182
- }
183
- let insert = this.knex(e.$entityName).insert(insertObject);
184
- if (isAutoIncrement(this.entity.idMetadata.field)) {
185
- let newId;
186
- if (this.knex.client.config.client === 'mysql2') {
187
- let result = await insert;
188
- newId = result[0];
189
- }
190
- else {
191
- let result = await insert.returning(this.entity.idMetadata.field.key);
192
- newId = result[0].id;
193
- }
194
- resultFilter = new Filter(x => x.isEqualTo(this.entity.idMetadata.field, newId));
195
- }
196
- else
197
- await insert;
198
- return this.find({ where: resultFilter }).then(y => {
199
- return y[0];
200
- });
201
- }
202
- }
203
- class FilterConsumerBridgeToKnexRequest {
204
- nameProvider;
205
- _addWhere = true;
206
- promises = [];
207
- result = [];
208
- async resolveWhere() {
209
- while (this.promises.length > 0) {
210
- let p = this.promises;
211
- this.promises = [];
212
- for (const pr of p) {
213
- await pr;
214
- }
215
- }
216
- return this.result;
217
- }
218
- constructor(nameProvider) {
219
- this.nameProvider = nameProvider;
220
- }
221
- custom(key, customItem) {
222
- throw new Error("Custom filter should be translated before it gets here");
223
- }
224
- or(orElements) {
225
- this.promises.push((async () => {
226
- const result = [];
227
- for (const element of orElements) {
228
- let f = new FilterConsumerBridgeToKnexRequest(this.nameProvider);
229
- f._addWhere = false;
230
- element.__applyToConsumer(f);
231
- let where = await f.resolveWhere();
232
- if (where.length > 0) {
233
- result.push(b => {
234
- b.orWhere(b => {
235
- where.forEach(x => x(b));
236
- });
237
- });
238
- }
239
- else
240
- return; //empty or means all rows
241
- }
242
- if (result.length > 0) {
243
- this.result.push(b => b.where(x => result.find(y => y(x))));
244
- }
245
- })());
246
- }
247
- isNull(col) {
248
- this.result.push(b => b.whereNull(this.nameProvider.$dbNameOf(col)));
249
- }
250
- isNotNull(col) {
251
- this.result.push(b => b.whereNotNull(this.nameProvider.$dbNameOf(col)));
252
- }
253
- isIn(col, val) {
254
- this.result.push(knex => knex.whereIn(this.nameProvider.$dbNameOf(col), val.map(x => translateValueAndHandleArrayAndHandleArray(col, x))));
255
- }
256
- isEqualTo(col, val) {
257
- this.add(col, val, "=");
258
- }
259
- isDifferentFrom(col, val) {
260
- this.add(col, val, "<>");
261
- }
262
- isGreaterOrEqualTo(col, val) {
263
- this.add(col, val, ">=");
264
- }
265
- isGreaterThan(col, val) {
266
- this.add(col, val, ">");
267
- }
268
- isLessOrEqualTo(col, val) {
269
- this.add(col, val, "<=");
270
- }
271
- isLessThan(col, val) {
272
- this.add(col, val, "<");
273
- }
274
- containsCaseInsensitive(col, val) {
275
- this.result.push(b => b.whereRaw('lower (' + b.client.ref(this.nameProvider.$dbNameOf(col)) + ") like lower ('%" + val.replace(/'/g, '\'\'') + "%')"));
276
- this.promises.push((async () => {
277
- })());
278
- }
279
- add(col, val, operator) {
280
- this.result.push(b => b.where(this.nameProvider.$dbNameOf(col), operator, translateValueAndHandleArrayAndHandleArray(col, val)));
281
- }
282
- databaseCustom(databaseCustom) {
283
- this.promises.push((async () => {
284
- if (databaseCustom?.buildKnex) {
285
- this.result.push(await databaseCustom.buildKnex());
286
- }
287
- })());
288
- }
289
- }
290
- export class KnexSchemaBuilder {
291
- knex;
292
- //@internal
293
- static logToConsole = true;
294
- async verifyStructureOfAllEntities(remult) {
295
- if (!remult)
296
- remult = remultContext;
297
- const entities = allEntities.map(x => remult.repo(x).metadata);
298
- this.ensureSchema(entities);
299
- }
300
- async ensureSchema(entities) {
301
- for (const entity of entities) {
302
- let e = await dbNamesOf(entity);
303
- try {
304
- if (!entity.options.sqlExpression) {
305
- if (e.$entityName.toLowerCase().indexOf('from ') < 0) {
306
- await this.createIfNotExist(entity);
307
- await this.verifyAllColumns(entity);
308
- }
309
- }
310
- }
311
- catch (err) {
312
- console.error("failed ensure schema of " + e.$entityName + " ", err);
313
- }
314
- }
315
- }
316
- async createIfNotExist(entity) {
317
- const e = await dbNamesOf(entity);
318
- if (!await this.knex.schema.hasTable(e.$entityName)) {
319
- let cols = new Map();
320
- for (const f of entity.fields) {
321
- cols.set(f, {
322
- name: e.$dbNameOf(f),
323
- readonly: isDbReadonly(f, e)
324
- });
325
- }
326
- await logSql(this.knex.schema.createTable(e.$entityName, b => {
327
- for (const x of entity.fields) {
328
- if (!cols.get(x).readonly || isAutoIncrement(x)) {
329
- if (isAutoIncrement(x))
330
- b.increments(cols.get(x).name);
331
- else {
332
- buildColumn(x, cols.get(x).name, b, supportsJson(this.knex));
333
- if (x == entity.idMetadata.field)
334
- b.primary([cols.get(x).name]);
335
- }
336
- }
337
- }
338
- }));
339
- }
340
- }
341
- async addColumnIfNotExist(entity, c) {
342
- let e = await dbNamesOf(entity);
343
- if (isDbReadonly(c(entity), e))
344
- return;
345
- let col = c(entity);
346
- let colName = e.$dbNameOf(col);
347
- if (!await this.knex.schema.hasColumn(e.$entityName, colName)) {
348
- await logSql(this.knex.schema.alterTable(e.$entityName, b => {
349
- buildColumn(col, colName, b, supportsJson(this.knex));
350
- }));
351
- }
352
- }
353
- async verifyAllColumns(entity) {
354
- let e = await dbNamesOf(entity);
355
- try {
356
- for (const col of entity.fields.toArray()) {
357
- if (!isDbReadonly(col, e)) {
358
- await this.addColumnIfNotExist(entity, () => col);
359
- }
360
- }
361
- }
362
- catch (err) {
363
- console.error(err);
364
- }
365
- }
366
- additionalWhere = '';
367
- constructor(knex) {
368
- this.knex = knex;
369
- }
370
- }
371
- function supportsJson(knex) {
372
- const client = knex.client.config.client;
373
- if (client?.includes("sqlite3") || client?.includes("mssql"))
374
- return false;
375
- return true;
376
- }
377
- export function buildColumn(x, dbName, b, supportsJson = true) {
378
- if (x.valueType == Number) {
379
- if (!x.valueConverter.fieldTypeInDb) {
380
- let c = b.decimal(dbName);
381
- if (!x.allowNull) {
382
- c.defaultTo(0).notNullable();
383
- }
384
- }
385
- else if (x.valueConverter.fieldTypeInDb == "integer") {
386
- let c = b.integer(dbName);
387
- if (!x.allowNull) {
388
- c.defaultTo(0).notNullable();
389
- }
390
- }
391
- else
392
- b.specificType(dbName, x.valueConverter.fieldTypeInDb);
393
- }
394
- else if (x.valueType == Date) {
395
- if (!x.valueConverter.fieldTypeInDb)
396
- if (x.valueConverter == ValueConverters.DateOnly)
397
- b.date(dbName);
398
- else
399
- b.dateTime(dbName);
400
- else if (x.valueConverter.fieldTypeInDb == "date")
401
- b.date(dbName);
402
- else
403
- b.specificType(dbName, x.valueConverter.fieldTypeInDb);
404
- }
405
- else if (x.valueType == Boolean) {
406
- let c = b.boolean(dbName);
407
- if (!x.allowNull)
408
- c.defaultTo(false).notNullable();
409
- }
410
- else if (x.valueConverter.fieldTypeInDb) {
411
- if (x.valueConverter.fieldTypeInDb == "integer") {
412
- let c = b.integer(dbName);
413
- if (!x.allowNull) {
414
- c.defaultTo(0).notNullable();
415
- }
416
- }
417
- else if (x.valueConverter.fieldTypeInDb == "json")
418
- if (supportsJson)
419
- b.json(dbName);
420
- else
421
- b.text(dbName);
422
- else
423
- b.specificType(dbName, x.valueConverter.fieldTypeInDb);
424
- }
425
- else {
426
- let c = b.string(dbName, x.options.maxLength);
427
- if (!x.allowNull)
428
- c.defaultTo('').notNullable();
429
- }
430
- }
431
- function logSql(who) {
432
- if (KnexSchemaBuilder.logToConsole)
433
- console.info(who.toSQL());
434
- return who;
435
- }
436
- export async function createKnexDataProvider(config) {
437
- let k = (await import('knex')).default(config);
438
- let result = new KnexDataProvider(k);
439
- return result;
440
- }
441
- function translateValueAndHandleArrayAndHandleArray(field, val) {
442
- let result = field.valueConverter.toDb(val);
443
- if (Array.isArray(result))
444
- return JSON.stringify(result);
445
- return result;
446
- }
@@ -1,24 +0,0 @@
1
- import type { MongoClient, Db, ClientSession } from 'mongodb';
2
- import { DataProvider, EntityDataProvider, EntityFilter, EntityMetadata, Remult } from '.';
3
- import { RepositoryOverloads } from './src/remult3';
4
- export declare class MongoDataProvider implements DataProvider {
5
- private db;
6
- private client;
7
- constructor(db: Db, client: MongoClient, options?: {
8
- session?: ClientSession;
9
- disableTransactions?: boolean;
10
- });
11
- session?: ClientSession;
12
- disableTransactions: boolean;
13
- static getDb(remult?: Remult): {
14
- db: Db;
15
- session: ClientSession | undefined;
16
- };
17
- getEntityDataProvider(entity: EntityMetadata<any>): EntityDataProvider;
18
- transaction(action: (dataProvider: DataProvider) => Promise<void>): Promise<void>;
19
- static filterToRaw<entityType>(entity: RepositoryOverloads<entityType>, condition: EntityFilter<entityType>): Promise<{
20
- $and: any[];
21
- } | {
22
- $and?: undefined;
23
- }>;
24
- }