remult 0.21.1 → 0.22.1
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.
- package/README.md +47 -46
- package/SseSubscriptionServer.js +9 -9
- package/ably.js +1 -1
- package/esm/SseSubscriptionServer.js +11 -11
- package/esm/ably.js +2 -2
- package/esm/angular/interfaces/index.d.ts +1 -0
- package/esm/angular/interfaces/index.js +1 -0
- package/esm/angular/interfaces/src/column-collection.d.ts +70 -0
- package/esm/angular/interfaces/src/column-collection.js +341 -0
- package/esm/angular/interfaces/src/data-area-settings.d.ts +15 -0
- package/esm/angular/interfaces/src/data-area-settings.js +35 -0
- package/esm/angular/interfaces/src/data-control-interfaces.d.ts +36 -0
- package/esm/angular/interfaces/src/data-control-interfaces.js +57 -0
- package/esm/angular/interfaces/src/dataList.d.ts +13 -0
- package/esm/angular/interfaces/src/dataList.js +42 -0
- package/esm/angular/interfaces/src/filter-helper.d.ts +13 -0
- package/esm/angular/interfaces/src/filter-helper.js +59 -0
- package/esm/angular/interfaces/src/grid-settings.d.ts +145 -0
- package/esm/angular/interfaces/src/grid-settings.js +387 -0
- package/esm/angular/interfaces/src/public_api.d.ts +4 -0
- package/esm/angular/interfaces/src/public_api.js +4 -0
- package/esm/angular/src/angular/RemultAngularPluginsService.d.ts +4 -0
- package/esm/angular/src/angular/RemultAngularPluginsService.js +3 -0
- package/esm/angular/src/angular/data-control/data-control2.component.d.ts +49 -0
- package/esm/angular/src/angular/data-control/data-control2.component.js +138 -0
- package/esm/core/SseSubscriptionServer.d.ts +33 -0
- package/esm/core/SseSubscriptionServer.js +107 -0
- package/esm/core/assign.d.ts +1 -0
- package/esm/core/assign.js +5 -0
- package/esm/core/classType.d.ts +3 -0
- package/esm/core/classType.js +1 -0
- package/esm/core/index.d.ts +27 -0
- package/esm/core/index.js +25 -0
- package/esm/core/inputTypes.d.ts +9 -0
- package/esm/core/inputTypes.js +9 -0
- package/esm/core/live-query/data-provider-live-query-storage.d.ts +22 -0
- package/esm/core/live-query/data-provider-live-query-storage.js +71 -0
- package/esm/core/postgres/index.d.ts +2 -0
- package/esm/core/postgres/index.js +2 -0
- package/esm/core/postgres/postgres-data-provider.d.ts +36 -0
- package/esm/core/postgres/postgres-data-provider.js +120 -0
- package/esm/core/postgres/schema-builder.d.ts +17 -0
- package/esm/core/postgres/schema-builder.js +153 -0
- package/esm/core/remult-fresh.d.ts +17 -0
- package/esm/core/remult-fresh.js +29 -0
- package/esm/core/remult-knex/index.d.ts +30 -0
- package/esm/core/remult-knex/index.js +446 -0
- package/esm/core/remult-mongo.d.ts +24 -0
- package/esm/core/remult-mongo.js +254 -0
- package/esm/core/server/JsonEntityFileStorage.d.ts +10 -0
- package/esm/core/server/JsonEntityFileStorage.js +25 -0
- package/esm/core/server/core.d.ts +4 -0
- package/esm/core/server/core.js +4 -0
- package/esm/core/server/expressBridge.d.ts +182 -0
- package/esm/core/server/expressBridge.js +938 -0
- package/esm/core/server/index.d.ts +6 -0
- package/esm/core/server/index.js +9 -0
- package/esm/core/server/initAsyncHooks.d.ts +1 -0
- package/esm/core/server/initAsyncHooks.js +9 -0
- package/esm/core/server/initDataProvider.d.ts +2 -0
- package/esm/core/server/initDataProvider.js +14 -0
- package/esm/core/src/__EntityValueProvider.d.ts +11 -0
- package/esm/core/src/__EntityValueProvider.js +1 -0
- package/esm/core/src/__RowsOfDataForTesting.d.ts +3 -0
- package/esm/core/src/__RowsOfDataForTesting.js +1 -0
- package/esm/core/src/backend-tests/backend-database-test-setup.backend-spec.d.ts +6 -0
- package/esm/core/src/backend-tests/backend-database-test-setup.backend-spec.js +147 -0
- package/esm/core/src/backend-tests/my-test.backend-spec.d.ts +1 -0
- package/esm/core/src/backend-tests/my-test.backend-spec.js +197 -0
- package/esm/core/src/backend-tests/test-http-server.backend-spec.d.ts +1 -0
- package/esm/core/src/backend-tests/test-http-server.backend-spec.js +167 -0
- package/esm/core/src/buildRestDataProvider.d.ts +31 -0
- package/esm/core/src/buildRestDataProvider.js +113 -0
- package/esm/core/src/column-interfaces.d.ts +154 -0
- package/esm/core/src/column-interfaces.js +7 -0
- package/esm/core/src/column.d.ts +58 -0
- package/esm/core/src/column.js +174 -0
- package/esm/core/src/context.d.ts +134 -0
- package/esm/core/src/context.js +286 -0
- package/esm/core/src/data-api.d.ts +39 -0
- package/esm/core/src/data-api.js +279 -0
- package/esm/core/src/data-interfaces.d.ts +41 -0
- package/esm/core/src/data-interfaces.js +12 -0
- package/esm/core/src/data-providers/array-entity-data-provider.d.ts +22 -0
- package/esm/core/src/data-providers/array-entity-data-provider.js +252 -0
- package/esm/core/src/data-providers/in-memory-database.d.ts +9 -0
- package/esm/core/src/data-providers/in-memory-database.js +14 -0
- package/esm/core/src/data-providers/json-data-provider.d.ts +12 -0
- package/esm/core/src/data-providers/json-data-provider.js +55 -0
- package/esm/core/src/data-providers/rest-data-provider.d.ts +49 -0
- package/esm/core/src/data-providers/rest-data-provider.js +256 -0
- package/esm/core/src/data-providers/sql-database.d.ts +33 -0
- package/esm/core/src/data-providers/sql-database.js +384 -0
- package/esm/core/src/data-providers/web-sql-data-provider.d.ts +24 -0
- package/esm/core/src/data-providers/web-sql-data-provider.js +143 -0
- package/esm/core/src/entity.d.ts +91 -0
- package/esm/core/src/entity.js +1 -0
- package/esm/core/src/filter/filter-consumer-bridge-to-sql-request.d.ts +50 -0
- package/esm/core/src/filter/filter-consumer-bridge-to-sql-request.js +150 -0
- package/esm/core/src/filter/filter-consumer-bridge-to-url-builder.d.ts +1 -0
- package/esm/core/src/filter/filter-consumer-bridge-to-url-builder.js +1 -0
- package/esm/core/src/filter/filter-interfaces.d.ts +85 -0
- package/esm/core/src/filter/filter-interfaces.js +477 -0
- package/esm/core/src/live-query/LiveQueryClient.d.ts +20 -0
- package/esm/core/src/live-query/LiveQueryClient.js +188 -0
- package/esm/core/src/live-query/SseSubscriptionClient.d.ts +5 -0
- package/esm/core/src/live-query/SseSubscriptionClient.js +86 -0
- package/esm/core/src/live-query/SubscriptionChannel.d.ts +72 -0
- package/esm/core/src/live-query/SubscriptionChannel.js +123 -0
- package/esm/core/src/live-query/SubscriptionServer.d.ts +53 -0
- package/esm/core/src/live-query/SubscriptionServer.js +111 -0
- package/esm/core/src/live-query/live-query-tests.spec.d.ts +6 -0
- package/esm/core/src/live-query/live-query-tests.spec.js +952 -0
- package/esm/core/src/remult-proxy.d.ts +35 -0
- package/esm/core/src/remult-proxy.js +113 -0
- package/esm/core/src/remult3/DecoratorReplacer.d.ts +10 -0
- package/esm/core/src/remult3/DecoratorReplacer.js +20 -0
- package/esm/core/src/remult3/RepositoryImplementation.d.ts +355 -0
- package/esm/core/src/remult3/RepositoryImplementation.js +2109 -0
- package/esm/core/src/remult3/index.d.ts +2 -0
- package/esm/core/src/remult3/index.js +2 -0
- package/esm/core/src/remult3/remult3.d.ts +395 -0
- package/esm/core/src/remult3/remult3.js +2 -0
- package/esm/core/src/server-action.d.ts +81 -0
- package/esm/core/src/server-action.js +394 -0
- package/esm/core/src/shared-tests/db-tests-setup.d.ts +32 -0
- package/esm/core/src/shared-tests/db-tests-setup.js +78 -0
- package/esm/core/src/shared-tests/db-tests.db-tests.d.ts +25 -0
- package/esm/core/src/shared-tests/db-tests.db-tests.js +810 -0
- package/esm/core/src/shared-tests/deleteAll.d.ts +2 -0
- package/esm/core/src/shared-tests/deleteAll.js +4 -0
- package/esm/core/src/shared-tests/entityWithValidations.d.ts +14 -0
- package/esm/core/src/shared-tests/entityWithValidations.js +43 -0
- package/esm/core/src/shared-tests/index.d.ts +4 -0
- package/esm/core/src/shared-tests/index.js +4 -0
- package/esm/core/src/shared-tests/test-custom-id-column.spec.d.ts +1 -0
- package/esm/core/src/shared-tests/test-custom-id-column.spec.js +67 -0
- package/esm/core/src/shared-tests/test-special-value.spec.d.ts +10 -0
- package/esm/core/src/shared-tests/test-special-value.spec.js +73 -0
- package/esm/core/src/shared-tests/test-update-with-null.spec.d.ts +1 -0
- package/esm/core/src/shared-tests/test-update-with-null.spec.js +31 -0
- package/esm/core/src/sort.d.ts +16 -0
- package/esm/core/src/sort.js +103 -0
- package/esm/core/src/sql-command.d.ts +19 -0
- package/esm/core/src/sql-command.js +1 -0
- package/esm/core/src/test.d.ts +3 -0
- package/esm/core/src/test.js +12 -0
- package/esm/core/src/tests/Done.d.ts +5 -0
- package/esm/core/src/tests/Done.js +9 -0
- package/esm/core/src/tests/RowProvider.spec.d.ts +16 -0
- package/esm/core/src/tests/RowProvider.spec.js +631 -0
- package/esm/core/src/tests/TestDataApiResponse.d.ts +10 -0
- package/esm/core/src/tests/TestDataApiResponse.js +22 -0
- package/esm/core/src/tests/basicRowFunctionality.spec.d.ts +8 -0
- package/esm/core/src/tests/basicRowFunctionality.spec.js +2103 -0
- package/esm/core/src/tests/c.d.ts +8 -0
- package/esm/core/src/tests/c.js +13 -0
- package/esm/core/src/tests/createData.d.ts +7 -0
- package/esm/core/src/tests/createData.js +22 -0
- package/esm/core/src/tests/d.d.ts +6 -0
- package/esm/core/src/tests/d.js +11 -0
- package/esm/core/src/tests/dWithPrefilter.d.ts +7 -0
- package/esm/core/src/tests/dWithPrefilter.js +18 -0
- package/esm/core/src/tests/entityForCustomFilter.d.ts +16 -0
- package/esm/core/src/tests/entityForCustomFilter.js +33 -0
- package/esm/core/src/tests/entityWithValidationsOnColumn.d.ts +5 -0
- package/esm/core/src/tests/entityWithValidationsOnColumn.js +13 -0
- package/esm/core/src/tests/frontend-database-tests-setup.spec.d.ts +4 -0
- package/esm/core/src/tests/frontend-database-tests-setup.spec.js +37 -0
- package/esm/core/src/tests/h.d.ts +6 -0
- package/esm/core/src/tests/h.js +24 -0
- package/esm/core/src/tests/remult-3-basic-tests.spec.d.ts +1 -0
- package/esm/core/src/tests/remult-3-basic-tests.spec.js +236 -0
- package/esm/core/src/tests/remult-3-entities.d.ts +23 -0
- package/esm/core/src/tests/remult-3-entities.js +39 -0
- package/esm/core/src/tests/tasks.d.ts +6 -0
- package/esm/core/src/tests/tasks.js +10 -0
- package/esm/core/src/tests/test-context-as-storage.spec.d.ts +0 -0
- package/esm/core/src/tests/test-context-as-storage.spec.js +1 -0
- package/esm/core/src/tests/test-data-api/predefined-filter.spec.d.ts +1 -0
- package/esm/core/src/tests/test-data-api/predefined-filter.spec.js +389 -0
- package/esm/core/src/tests/test-data-api/test-put-with-validation.spec.d.ts +5 -0
- package/esm/core/src/tests/test-data-api/test-put-with-validation.spec.js +152 -0
- package/esm/core/src/tests/test-decorator-precedence.spec.d.ts +1 -0
- package/esm/core/src/tests/test-decorator-precedence.spec.js +38 -0
- package/esm/core/src/tests/test-default-value.spec.d.ts +1 -0
- package/esm/core/src/tests/test-default-value.spec.js +33 -0
- package/esm/core/src/tests/test-entity-inheritance.spec.d.ts +14 -0
- package/esm/core/src/tests/test-entity-inheritance.spec.js +82 -0
- package/esm/core/src/tests/test-exceptions.spec.d.ts +1 -0
- package/esm/core/src/tests/test-exceptions.spec.js +375 -0
- package/esm/core/src/tests/test-json.spec.d.ts +1 -0
- package/esm/core/src/tests/test-json.spec.js +115 -0
- package/esm/core/src/tests/test-many-to-one-relation-in-entity.spec.d.ts +9 -0
- package/esm/core/src/tests/test-many-to-one-relation-in-entity.spec.js +809 -0
- package/esm/core/src/tests/test-non-active-record.spec.d.ts +1 -0
- package/esm/core/src/tests/test-non-active-record.spec.js +66 -0
- package/esm/core/src/tests/test-object-column.spec.d.ts +1 -0
- package/esm/core/src/tests/test-object-column.spec.js +189 -0
- package/esm/core/src/tests/test-paged-foreach.spec.d.ts +1 -0
- package/esm/core/src/tests/test-paged-foreach.spec.js +328 -0
- package/esm/core/src/tests/test-remult-angular.spec.d.ts +1 -0
- package/esm/core/src/tests/test-remult-angular.spec.js +23 -0
- package/esm/core/src/tests/test-server-controller.spec.d.ts +7 -0
- package/esm/core/src/tests/test-server-controller.spec.js +489 -0
- package/esm/core/src/tests/test-server-expressions.spec.d.ts +1 -0
- package/esm/core/src/tests/test-server-expressions.spec.js +178 -0
- package/esm/core/src/tests/test-server-method-on-entity.spec.d.ts +1 -0
- package/esm/core/src/tests/test-server-method-on-entity.spec.js +306 -0
- package/esm/core/src/tests/test-sql-expression.spec.d.ts +5 -0
- package/esm/core/src/tests/test-sql-expression.spec.js +205 -0
- package/esm/core/src/tests/test-sql.spec.d.ts +1 -0
- package/esm/core/src/tests/test-sql.spec.js +170 -0
- package/esm/core/src/tests/test-subscribe.spec.d.ts +1 -0
- package/esm/core/src/tests/test-subscribe.spec.js +135 -0
- package/esm/core/src/tests/test-type-recovery.spec.d.ts +1 -0
- package/esm/core/src/tests/test-type-recovery.spec.js +49 -0
- package/esm/core/src/tests/test-where-api.spec.d.ts +1 -0
- package/esm/core/src/tests/test-where-api.spec.js +434 -0
- package/esm/core/src/tests/testHelper.spec.d.ts +36 -0
- package/esm/core/src/tests/testHelper.spec.js +226 -0
- package/esm/core/src/tests/testModel/models.d.ts +16 -0
- package/esm/core/src/tests/testModel/models.js +25 -0
- package/esm/core/src/validators.d.ts +14 -0
- package/esm/core/src/validators.js +33 -0
- package/esm/core/src/valueConverters.d.ts +13 -0
- package/esm/core/src/valueConverters.js +197 -0
- package/esm/core/urlBuilder.d.ts +6 -0
- package/esm/core/urlBuilder.js +20 -0
- package/esm/graphql.js +194 -73
- package/esm/index.d.ts +10 -10
- package/esm/index.js +8 -8
- package/esm/inputTypes.js +1 -1
- package/esm/live-query/data-provider-live-query-storage.d.ts +3 -3
- package/esm/live-query/data-provider-live-query-storage.js +12 -9
- package/esm/myLog.js +2 -2
- package/esm/postgres/postgres-data-provider.d.ts +2 -2
- package/esm/postgres/postgres-data-provider.js +20 -14
- package/esm/postgres/schema-builder.d.ts +1 -1
- package/esm/postgres/schema-builder.js +28 -21
- package/esm/remult-express.js +2 -2
- package/esm/remult-fastify.js +9 -7
- package/esm/remult-fresh.d.ts +1 -1
- package/esm/remult-fresh.js +5 -8
- package/esm/remult-knex/index.d.ts +4 -4
- package/esm/remult-knex/index.js +75 -59
- package/esm/remult-mongo.js +53 -39
- package/esm/remult-next.d.ts +3 -3
- package/esm/remult-next.js +17 -11
- package/esm/remult-sveltekit.js +10 -10
- package/esm/server/JsonEntityFileStorage.js +3 -1
- package/esm/server/core.d.ts +2 -2
- package/esm/server/core.js +2 -2
- package/esm/server/expressBridge.d.ts +3 -12
- package/esm/server/expressBridge.js +265 -278
- package/esm/server/index.d.ts +2 -2
- package/esm/server/index.js +5 -2
- package/esm/server/initAsyncHooks.js +1 -1
- package/esm/server/initDataProvider.js +1 -1
- package/esm/src/backend-tests/backend-database-test-setup.backend-spec.d.ts +3 -2
- package/esm/src/backend-tests/backend-database-test-setup.backend-spec.js +121 -66
- package/esm/src/buildRestDataProvider.d.ts +1 -1
- package/esm/src/buildRestDataProvider.js +21 -13
- package/esm/src/column-interfaces.d.ts +9 -9
- package/esm/src/column.d.ts +4 -0
- package/esm/src/column.js +23 -11
- package/esm/src/context.d.ts +20 -8
- package/esm/src/context.js +65 -24
- package/esm/src/data-api.d.ts +0 -1
- package/esm/src/data-api.js +38 -37
- package/esm/src/data-interfaces.d.ts +1 -1
- package/esm/src/data-interfaces.js +1 -1
- package/esm/src/data-providers/array-entity-data-provider.js +9 -9
- package/esm/src/data-providers/in-memory-database.d.ts +1 -1
- package/esm/src/data-providers/in-memory-database.js +3 -1
- package/esm/src/data-providers/json-data-provider.js +8 -8
- package/esm/src/data-providers/rest-data-provider.d.ts +1 -1
- package/esm/src/data-providers/rest-data-provider.js +52 -36
- package/esm/src/data-providers/sql-database.d.ts +5 -5
- package/esm/src/data-providers/sql-database.js +53 -36
- package/esm/src/data-providers/web-sql-data-provider.d.ts +4 -4
- package/esm/src/data-providers/web-sql-data-provider.js +15 -13
- package/esm/src/entity.d.ts +24 -24
- package/esm/src/filter/filter-consumer-bridge-to-sql-request.d.ts +4 -4
- package/esm/src/filter/filter-consumer-bridge-to-sql-request.js +35 -20
- package/esm/src/filter/filter-interfaces.d.ts +7 -7
- package/esm/src/filter/filter-interfaces.js +108 -88
- package/esm/src/live-query/LiveQueryClient.js +37 -29
- package/esm/src/live-query/SseSubscriptionClient.d.ts +1 -1
- package/esm/src/live-query/SseSubscriptionClient.js +14 -14
- package/esm/src/live-query/SubscriptionChannel.d.ts +3 -3
- package/esm/src/live-query/SubscriptionChannel.js +27 -25
- package/esm/src/live-query/SubscriptionServer.js +24 -20
- package/esm/src/remult-proxy.d.ts +1 -1
- package/esm/src/remult-proxy.js +87 -29
- package/esm/src/remult3/DecoratorReplacer.d.ts +2 -2
- package/esm/src/remult3/RepositoryImplementation.d.ts +51 -41
- package/esm/src/remult3/RepositoryImplementation.js +336 -206
- package/esm/src/remult3/remult3.d.ts +56 -51
- package/esm/src/remult3/remult3.js +0 -1
- package/esm/src/server-action.d.ts +12 -5
- package/esm/src/server-action.js +79 -53
- package/esm/src/shared-tests/db-tests-setup.d.ts +10 -8
- package/esm/src/shared-tests/db-tests-setup.js +12 -10
- package/esm/src/shared-tests/db-tests.db-tests.d.ts +1 -1
- package/esm/src/shared-tests/db-tests.db-tests.js +319 -177
- package/esm/src/shared-tests/deleteAll.d.ts +1 -1
- package/esm/src/shared-tests/deleteAll.js +1 -1
- package/esm/src/shared-tests/entityWithValidations.js +1 -1
- package/esm/src/shared-tests/test-custom-id-column.spec.js +4 -4
- package/esm/src/shared-tests/test-special-value.spec.js +12 -12
- package/esm/src/shared-tests/test-update-with-null.spec.js +10 -6
- package/esm/src/sort.d.ts +2 -2
- package/esm/src/sort.js +12 -10
- package/esm/src/tests/TestDataApiResponse.d.ts +1 -1
- package/esm/src/tests/TestDataApiResponse.js +3 -4
- package/esm/src/tests/createData.js +2 -2
- package/esm/src/tests/d.js +1 -1
- package/esm/src/tests/dWithPrefilter.js +1 -1
- package/esm/src/tests/entityForCustomFilter.d.ts +4 -4
- package/esm/src/tests/entityForCustomFilter.js +12 -4
- package/esm/src/tests/entityWithValidationsOnColumn.js +1 -1
- package/esm/src/tests/frontend-database-tests-setup.spec.d.ts +1 -1
- package/esm/src/tests/frontend-database-tests-setup.spec.js +15 -15
- package/esm/src/tests/h.js +4 -4
- package/esm/src/tests/remult-3-entities.d.ts +2 -2
- package/esm/src/tests/remult-3-entities.js +6 -6
- package/esm/src/tests/testHelper.spec.d.ts +7 -7
- package/esm/src/tests/testHelper.spec.js +50 -39
- package/esm/src/tests/testModel/models.js +4 -4
- package/esm/src/validators.d.ts +1 -1
- package/esm/src/validators.js +10 -7
- package/esm/src/valueConverters.d.ts +1 -1
- package/esm/src/valueConverters.js +68 -55
- package/esm/test-servers/shared/Task.d.ts +9 -0
- package/esm/test-servers/shared/Task.js +32 -0
- package/esm/test.d.ts +5 -0
- package/esm/test.js +6 -0
- package/graphql.js +157 -45
- package/index.d.ts +10 -10
- package/inputTypes.js +1 -1
- package/live-query/data-provider-live-query-storage.d.ts +3 -3
- package/live-query/data-provider-live-query-storage.js +7 -4
- package/myLog.js +2 -2
- package/package.json +2 -2
- package/postgres/postgres-data-provider.d.ts +2 -2
- package/postgres/postgres-data-provider.js +21 -16
- package/postgres/schema-builder.d.ts +1 -1
- package/postgres/schema-builder.js +22 -15
- package/remult-express.js +1 -1
- package/remult-fastify.js +7 -7
- package/remult-fresh.d.ts +1 -1
- package/remult-fresh.js +1 -4
- package/remult-knex/index.d.ts +4 -4
- package/remult-knex/index.js +50 -35
- package/remult-mongo.js +51 -35
- package/remult-next.d.ts +3 -3
- package/remult-next.js +15 -11
- package/remult-sveltekit.js +14 -15
- package/server/core.d.ts +2 -2
- package/server/expressBridge.d.ts +3 -12
- package/server/expressBridge.js +278 -279
- package/server/index.d.ts +2 -2
- package/server/index.js +5 -2
- package/server/initAsyncHooks.js +2 -2
- package/server/initDataProvider.js +1 -1
- package/src/backend-tests/backend-database-test-setup.backend-spec.d.ts +3 -2
- package/src/backend-tests/backend-database-test-setup.backend-spec.js +214 -127
- package/src/buildRestDataProvider.d.ts +1 -1
- package/src/buildRestDataProvider.js +18 -10
- package/src/column-interfaces.d.ts +9 -9
- package/src/column.d.ts +4 -0
- package/src/column.js +20 -8
- package/src/context.d.ts +20 -8
- package/src/context.js +61 -18
- package/src/data-api.d.ts +0 -1
- package/src/data-api.js +40 -43
- package/src/data-interfaces.d.ts +1 -1
- package/src/data-providers/array-entity-data-provider.js +2 -2
- package/src/data-providers/in-memory-database.d.ts +1 -1
- package/src/data-providers/in-memory-database.js +3 -1
- package/src/data-providers/json-data-provider.js +33 -15
- package/src/data-providers/rest-data-provider.d.ts +1 -1
- package/src/data-providers/rest-data-provider.js +47 -32
- package/src/data-providers/sql-database.d.ts +5 -5
- package/src/data-providers/sql-database.js +41 -24
- package/src/data-providers/web-sql-data-provider.d.ts +4 -4
- package/src/data-providers/web-sql-data-provider.js +10 -8
- package/src/entity.d.ts +24 -24
- package/src/filter/filter-consumer-bridge-to-sql-request.d.ts +4 -4
- package/src/filter/filter-consumer-bridge-to-sql-request.js +34 -17
- package/src/filter/filter-interfaces.d.ts +7 -7
- package/src/filter/filter-interfaces.js +73 -47
- package/src/live-query/LiveQueryClient.js +35 -25
- package/src/live-query/SseSubscriptionClient.d.ts +1 -1
- package/src/live-query/SseSubscriptionClient.js +80 -76
- package/src/live-query/SubscriptionChannel.d.ts +3 -3
- package/src/live-query/SubscriptionChannel.js +26 -18
- package/src/live-query/SubscriptionServer.js +23 -17
- package/src/remult-proxy.d.ts +1 -1
- package/src/remult-proxy.js +84 -35
- package/src/remult3/DecoratorReplacer.d.ts +2 -2
- package/src/remult3/RepositoryImplementation.d.ts +51 -41
- package/src/remult3/RepositoryImplementation.js +402 -257
- package/src/remult3/remult3.d.ts +56 -51
- package/src/remult3/remult3.js +0 -1
- package/src/server-action.d.ts +12 -5
- package/src/server-action.js +78 -48
- package/src/shared-tests/db-tests-setup.d.ts +10 -8
- package/src/shared-tests/db-tests-setup.js +8 -6
- package/src/shared-tests/db-tests.db-tests.d.ts +1 -1
- package/src/shared-tests/db-tests.db-tests.js +455 -165
- package/src/shared-tests/deleteAll.d.ts +1 -1
- package/src/shared-tests/entityWithValidations.js +1 -1
- package/src/shared-tests/test-custom-id-column.spec.js +4 -4
- package/src/shared-tests/test-special-value.spec.js +9 -9
- package/src/shared-tests/test-update-with-null.spec.js +8 -4
- package/src/sort.d.ts +2 -2
- package/src/sort.js +9 -7
- package/src/tests/TestDataApiResponse.d.ts +1 -1
- package/src/tests/TestDataApiResponse.js +3 -4
- package/src/tests/createData.js +1 -1
- package/src/tests/d.js +1 -1
- package/src/tests/dWithPrefilter.js +1 -1
- package/src/tests/entityForCustomFilter.d.ts +4 -4
- package/src/tests/entityForCustomFilter.js +16 -6
- package/src/tests/entityWithValidationsOnColumn.js +1 -1
- package/src/tests/frontend-database-tests-setup.spec.d.ts +1 -1
- package/src/tests/frontend-database-tests-setup.spec.js +9 -9
- package/src/tests/h.js +3 -3
- package/src/tests/remult-3-entities.d.ts +2 -2
- package/src/tests/remult-3-entities.js +8 -4
- package/src/tests/testHelper.spec.d.ts +7 -7
- package/src/tests/testHelper.spec.js +38 -27
- package/src/tests/testModel/models.js +3 -3
- package/src/validators.d.ts +1 -1
- package/src/validators.js +18 -9
- package/src/valueConverters.d.ts +1 -1
- package/src/valueConverters.js +38 -21
- package/esm/remult-svletekit.d.ts +0 -3
- package/esm/remult-svletekit.js +0 -83
- package/esm/src/id-entity.d.ts +0 -4
- package/esm/src/id-entity.js +0 -8
- package/esm/src/remult3/getId.d.ts +0 -2
- package/esm/src/remult3/getId.js +0 -7
- package/postgres/getEntityTypescriptPostgres.d.ts +0 -1
- package/postgres/getEntityTypescriptPostgres.js +0 -125
- package/src/id-entity.d.ts +0 -4
- package/src/id-entity.js +0 -17
- package/src/remult3/getId.d.ts +0 -2
- package/src/remult3/getId.js +0 -11
package/esm/remult-knex/index.js
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
import { customDatabaseFilterToken, Filter } from
|
|
2
|
-
import { dbNamesOf, isDbReadonly } from
|
|
3
|
-
import { allEntities } from
|
|
4
|
-
import { isAutoIncrement, getRepository } from
|
|
5
|
-
import { ValueConverters } from
|
|
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
6
|
import { CompoundIdField } from '../src/column';
|
|
7
7
|
import { Sort } from '../src/sort';
|
|
8
|
-
import { remult as remultContext
|
|
8
|
+
import { remult as remultContext } from '../src/remult-proxy';
|
|
9
9
|
export class KnexDataProvider {
|
|
10
10
|
constructor(knex) {
|
|
11
11
|
this.knex = knex;
|
|
@@ -13,15 +13,19 @@ export class KnexDataProvider {
|
|
|
13
13
|
static getDb(remult) {
|
|
14
14
|
const r = (remult || remultContext).dataProvider;
|
|
15
15
|
if (!r.knex)
|
|
16
|
-
throw
|
|
16
|
+
throw 'the data provider is not an KnexDataProvider';
|
|
17
17
|
return r.knex;
|
|
18
18
|
}
|
|
19
19
|
getEntityDataProvider(entity) {
|
|
20
20
|
if (!supportsJson(this.knex))
|
|
21
21
|
for (const f of entity.fields.toArray()) {
|
|
22
|
-
if (f.valueConverter.fieldTypeInDb ===
|
|
22
|
+
if (f.valueConverter.fieldTypeInDb === 'json') {
|
|
23
23
|
//@ts-ignore
|
|
24
|
-
f.valueConverter = {
|
|
24
|
+
f.valueConverter = {
|
|
25
|
+
...f.valueConverter,
|
|
26
|
+
toDb: ValueConverters.JsonString.toDb,
|
|
27
|
+
fromDb: ValueConverters.JsonString.fromDb,
|
|
28
|
+
};
|
|
25
29
|
}
|
|
26
30
|
}
|
|
27
31
|
return new KnexEntityDataProvider(entity, this.knex);
|
|
@@ -40,17 +44,17 @@ export class KnexDataProvider {
|
|
|
40
44
|
static rawFilter(build) {
|
|
41
45
|
return {
|
|
42
46
|
[customDatabaseFilterToken]: {
|
|
43
|
-
buildKnex: build
|
|
44
|
-
}
|
|
47
|
+
buildKnex: build,
|
|
48
|
+
},
|
|
45
49
|
};
|
|
46
50
|
}
|
|
47
51
|
static async filterToRaw(entity, condition) {
|
|
48
52
|
const repo = getRepository(entity);
|
|
49
53
|
var b = new FilterConsumerBridgeToKnexRequest(await dbNamesOf(repo.metadata));
|
|
50
54
|
b._addWhere = false;
|
|
51
|
-
await (await
|
|
55
|
+
await (await repo.translateWhereToFilter(condition)).__applyToConsumer(b);
|
|
52
56
|
let r = await b.resolveWhere();
|
|
53
|
-
return knex => r.forEach(y => y(knex));
|
|
57
|
+
return (knex) => r.forEach((y) => y(knex));
|
|
54
58
|
}
|
|
55
59
|
async ensureSchema(entities) {
|
|
56
60
|
var sb = new KnexSchemaBuilder(this.knex);
|
|
@@ -67,8 +71,9 @@ class KnexEntityDataProvider {
|
|
|
67
71
|
const br = new FilterConsumerBridgeToKnexRequest(e);
|
|
68
72
|
where.__applyToConsumer(br);
|
|
69
73
|
let r = await br.resolveWhere();
|
|
70
|
-
const result =
|
|
71
|
-
.count()
|
|
74
|
+
const result = await this.knex(e.$entityName)
|
|
75
|
+
.count()
|
|
76
|
+
.where((b) => r.forEach((w) => w(b)));
|
|
72
77
|
var row = result[0];
|
|
73
78
|
for (const key in row) {
|
|
74
79
|
if (Object.prototype.hasOwnProperty.call(row, key)) {
|
|
@@ -94,15 +99,15 @@ class KnexEntityDataProvider {
|
|
|
94
99
|
const br = new FilterConsumerBridgeToKnexRequest(e);
|
|
95
100
|
options.where.__applyToConsumer(br);
|
|
96
101
|
let r = await br.resolveWhere();
|
|
97
|
-
query.where(b => r.forEach(y => y(b)));
|
|
102
|
+
query.where((b) => r.forEach((y) => y(b)));
|
|
98
103
|
}
|
|
99
104
|
if (!options.orderBy) {
|
|
100
105
|
options.orderBy = Sort.createUniqueSort(this.entity, new Sort());
|
|
101
106
|
}
|
|
102
107
|
if (options.orderBy) {
|
|
103
|
-
query = query.orderBy(options.orderBy.Segments.map(s => ({
|
|
108
|
+
query = query.orderBy(options.orderBy.Segments.map((s) => ({
|
|
104
109
|
column: e.$dbNameOf(s.field),
|
|
105
|
-
order: s.isDescending ?
|
|
110
|
+
order: s.isDescending ? 'desc' : 'asc',
|
|
106
111
|
})));
|
|
107
112
|
}
|
|
108
113
|
if (options.limit) {
|
|
@@ -111,7 +116,7 @@ class KnexEntityDataProvider {
|
|
|
111
116
|
query = query.offset((options.page - 1) * options.limit);
|
|
112
117
|
}
|
|
113
118
|
const r = await query;
|
|
114
|
-
return r.map(y => {
|
|
119
|
+
return r.map((y) => {
|
|
115
120
|
let result = {};
|
|
116
121
|
let i = 0;
|
|
117
122
|
for (let m in y) {
|
|
@@ -120,14 +125,14 @@ class KnexEntityDataProvider {
|
|
|
120
125
|
result[field.key] = field.valueConverter.fromDb(y[m]);
|
|
121
126
|
}
|
|
122
127
|
catch (err) {
|
|
123
|
-
throw new Error(
|
|
128
|
+
throw new Error('Failed to load from db:' + field.key + '\r\n' + err);
|
|
124
129
|
}
|
|
125
130
|
}
|
|
126
131
|
return result;
|
|
127
132
|
});
|
|
128
133
|
}
|
|
129
134
|
async init() {
|
|
130
|
-
return await dbNamesOf(this.entity);
|
|
135
|
+
return (await dbNamesOf(this.entity));
|
|
131
136
|
}
|
|
132
137
|
async update(id, data) {
|
|
133
138
|
const e = await this.init();
|
|
@@ -138,7 +143,8 @@ class KnexEntityDataProvider {
|
|
|
138
143
|
resultFilter = this.entity.idMetadata.getIdFilter(data.id);
|
|
139
144
|
let updateObject = {};
|
|
140
145
|
for (const x of this.entity.fields) {
|
|
141
|
-
if (isDbReadonly(x, e)) {
|
|
146
|
+
if (isDbReadonly(x, e)) {
|
|
147
|
+
}
|
|
142
148
|
else if (data[x.key] !== undefined) {
|
|
143
149
|
let v = translateValueAndHandleArrayAndHandleArray(x, data[x.key]);
|
|
144
150
|
if (v !== undefined) {
|
|
@@ -148,15 +154,21 @@ class KnexEntityDataProvider {
|
|
|
148
154
|
}
|
|
149
155
|
}
|
|
150
156
|
let where = await f.resolveWhere();
|
|
151
|
-
await this.knex(e.$entityName)
|
|
152
|
-
|
|
157
|
+
await this.knex(e.$entityName)
|
|
158
|
+
.update(updateObject)
|
|
159
|
+
.where((b) => where.forEach((w) => w(b)));
|
|
160
|
+
return this.find({
|
|
161
|
+
where: Filter.fromEntityFilter(this.entity, resultFilter),
|
|
162
|
+
}).then((y) => y[0]);
|
|
153
163
|
}
|
|
154
164
|
async delete(id) {
|
|
155
165
|
const e = await this.init();
|
|
156
166
|
let f = new FilterConsumerBridgeToKnexRequest(e);
|
|
157
167
|
Filter.fromEntityFilter(this.entity, this.entity.idMetadata.getIdFilter(id)).__applyToConsumer(f);
|
|
158
168
|
let where = await f.resolveWhere();
|
|
159
|
-
await this.knex(e.$entityName)
|
|
169
|
+
await this.knex(e.$entityName)
|
|
170
|
+
.delete()
|
|
171
|
+
.where((b) => where.forEach((w) => w(b)));
|
|
160
172
|
}
|
|
161
173
|
async insert(data) {
|
|
162
174
|
const e = await this.init();
|
|
@@ -167,7 +179,8 @@ class KnexEntityDataProvider {
|
|
|
167
179
|
resultFilter = Filter.fromEntityFilter(this.entity, this.entity.idMetadata.getIdFilter(data[this.entity.idMetadata.field.key]));
|
|
168
180
|
let insertObject = {};
|
|
169
181
|
for (const x of this.entity.fields) {
|
|
170
|
-
if (isDbReadonly(x, e)) {
|
|
182
|
+
if (isDbReadonly(x, e)) {
|
|
183
|
+
}
|
|
171
184
|
else {
|
|
172
185
|
let v = translateValueAndHandleArrayAndHandleArray(x, data[x.key]);
|
|
173
186
|
if (v != undefined) {
|
|
@@ -187,11 +200,11 @@ class KnexEntityDataProvider {
|
|
|
187
200
|
let result = await insert.returning(this.entity.idMetadata.field.key);
|
|
188
201
|
newId = result[0].id;
|
|
189
202
|
}
|
|
190
|
-
resultFilter = new Filter(x => x.isEqualTo(this.entity.idMetadata.field, newId));
|
|
203
|
+
resultFilter = new Filter((x) => x.isEqualTo(this.entity.idMetadata.field, newId));
|
|
191
204
|
}
|
|
192
205
|
else
|
|
193
206
|
await insert;
|
|
194
|
-
return this.find({ where: resultFilter }).then(y => {
|
|
207
|
+
return this.find({ where: resultFilter }).then((y) => {
|
|
195
208
|
return y[0];
|
|
196
209
|
});
|
|
197
210
|
}
|
|
@@ -214,7 +227,7 @@ class FilterConsumerBridgeToKnexRequest {
|
|
|
214
227
|
return this.result;
|
|
215
228
|
}
|
|
216
229
|
custom(key, customItem) {
|
|
217
|
-
throw new Error(
|
|
230
|
+
throw new Error('Custom filter should be translated before it gets here');
|
|
218
231
|
}
|
|
219
232
|
or(orElements) {
|
|
220
233
|
this.promises.push((async () => {
|
|
@@ -225,9 +238,9 @@ class FilterConsumerBridgeToKnexRequest {
|
|
|
225
238
|
element.__applyToConsumer(f);
|
|
226
239
|
let where = await f.resolveWhere();
|
|
227
240
|
if (where.length > 0) {
|
|
228
|
-
result.push(b => {
|
|
229
|
-
b.orWhere(b => {
|
|
230
|
-
where.forEach(x => x(b));
|
|
241
|
+
result.push((b) => {
|
|
242
|
+
b.orWhere((b) => {
|
|
243
|
+
where.forEach((x) => x(b));
|
|
231
244
|
});
|
|
232
245
|
});
|
|
233
246
|
}
|
|
@@ -235,44 +248,47 @@ class FilterConsumerBridgeToKnexRequest {
|
|
|
235
248
|
return; //empty or means all rows
|
|
236
249
|
}
|
|
237
250
|
if (result.length > 0) {
|
|
238
|
-
this.result.push(b => b.where(x => result.find(y => y(x))));
|
|
251
|
+
this.result.push((b) => b.where((x) => result.find((y) => y(x))));
|
|
239
252
|
}
|
|
240
253
|
})());
|
|
241
254
|
}
|
|
242
255
|
isNull(col) {
|
|
243
|
-
this.result.push(b => b.whereNull(this.nameProvider.$dbNameOf(col)));
|
|
256
|
+
this.result.push((b) => b.whereNull(this.nameProvider.$dbNameOf(col)));
|
|
244
257
|
}
|
|
245
258
|
isNotNull(col) {
|
|
246
|
-
this.result.push(b => b.whereNotNull(this.nameProvider.$dbNameOf(col)));
|
|
259
|
+
this.result.push((b) => b.whereNotNull(this.nameProvider.$dbNameOf(col)));
|
|
247
260
|
}
|
|
248
261
|
isIn(col, val) {
|
|
249
|
-
this.result.push(knex => knex.whereIn(this.nameProvider.$dbNameOf(col), val.map(x => translateValueAndHandleArrayAndHandleArray(col, x))));
|
|
262
|
+
this.result.push((knex) => knex.whereIn(this.nameProvider.$dbNameOf(col), val.map((x) => translateValueAndHandleArrayAndHandleArray(col, x))));
|
|
250
263
|
}
|
|
251
264
|
isEqualTo(col, val) {
|
|
252
|
-
this.add(col, val,
|
|
265
|
+
this.add(col, val, '=');
|
|
253
266
|
}
|
|
254
267
|
isDifferentFrom(col, val) {
|
|
255
|
-
this.add(col, val,
|
|
268
|
+
this.add(col, val, '<>');
|
|
256
269
|
}
|
|
257
270
|
isGreaterOrEqualTo(col, val) {
|
|
258
|
-
this.add(col, val,
|
|
271
|
+
this.add(col, val, '>=');
|
|
259
272
|
}
|
|
260
273
|
isGreaterThan(col, val) {
|
|
261
|
-
this.add(col, val,
|
|
274
|
+
this.add(col, val, '>');
|
|
262
275
|
}
|
|
263
276
|
isLessOrEqualTo(col, val) {
|
|
264
|
-
this.add(col, val,
|
|
277
|
+
this.add(col, val, '<=');
|
|
265
278
|
}
|
|
266
279
|
isLessThan(col, val) {
|
|
267
|
-
this.add(col, val,
|
|
280
|
+
this.add(col, val, '<');
|
|
268
281
|
}
|
|
269
282
|
containsCaseInsensitive(col, val) {
|
|
270
|
-
this.result.push(b => b.whereRaw('lower (' +
|
|
271
|
-
|
|
272
|
-
|
|
283
|
+
this.result.push((b) => b.whereRaw('lower (' +
|
|
284
|
+
b.client.ref(this.nameProvider.$dbNameOf(col)) +
|
|
285
|
+
") like lower ('%" +
|
|
286
|
+
val.replace(/'/g, "''") +
|
|
287
|
+
"%')"));
|
|
288
|
+
this.promises.push((async () => { })());
|
|
273
289
|
}
|
|
274
290
|
add(col, val, operator) {
|
|
275
|
-
this.result.push(b => b.where(this.nameProvider.$dbNameOf(col), operator, translateValueAndHandleArrayAndHandleArray(col, val)));
|
|
291
|
+
this.result.push((b) => b.where(this.nameProvider.$dbNameOf(col), operator, translateValueAndHandleArrayAndHandleArray(col, val)));
|
|
276
292
|
}
|
|
277
293
|
databaseCustom(databaseCustom) {
|
|
278
294
|
this.promises.push((async () => {
|
|
@@ -289,8 +305,8 @@ export class KnexSchemaBuilder {
|
|
|
289
305
|
}
|
|
290
306
|
async verifyStructureOfAllEntities(remult) {
|
|
291
307
|
if (!remult)
|
|
292
|
-
remult =
|
|
293
|
-
const entities = allEntities.map(x => remult.repo(x).metadata);
|
|
308
|
+
remult = remultContext;
|
|
309
|
+
const entities = allEntities.map((x) => remult.repo(x).metadata);
|
|
294
310
|
this.ensureSchema(entities);
|
|
295
311
|
}
|
|
296
312
|
async ensureSchema(entities) {
|
|
@@ -305,21 +321,21 @@ export class KnexSchemaBuilder {
|
|
|
305
321
|
}
|
|
306
322
|
}
|
|
307
323
|
catch (err) {
|
|
308
|
-
console.error(
|
|
324
|
+
console.error('failed ensure schema of ' + e.$entityName + ' ', err);
|
|
309
325
|
}
|
|
310
326
|
}
|
|
311
327
|
}
|
|
312
328
|
async createIfNotExist(entity) {
|
|
313
329
|
const e = await dbNamesOf(entity);
|
|
314
|
-
if (!await this.knex.schema.hasTable(e.$entityName)) {
|
|
330
|
+
if (!(await this.knex.schema.hasTable(e.$entityName))) {
|
|
315
331
|
let cols = new Map();
|
|
316
332
|
for (const f of entity.fields) {
|
|
317
333
|
cols.set(f, {
|
|
318
334
|
name: e.$dbNameOf(f),
|
|
319
|
-
readonly: isDbReadonly(f, e)
|
|
335
|
+
readonly: isDbReadonly(f, e),
|
|
320
336
|
});
|
|
321
337
|
}
|
|
322
|
-
await logSql(this.knex.schema.createTable(e.$entityName, b => {
|
|
338
|
+
await logSql(this.knex.schema.createTable(e.$entityName, (b) => {
|
|
323
339
|
for (const x of entity.fields) {
|
|
324
340
|
if (!cols.get(x).readonly || isAutoIncrement(x)) {
|
|
325
341
|
if (isAutoIncrement(x))
|
|
@@ -340,8 +356,8 @@ export class KnexSchemaBuilder {
|
|
|
340
356
|
return;
|
|
341
357
|
let col = c(entity);
|
|
342
358
|
let colName = e.$dbNameOf(col);
|
|
343
|
-
if (!await this.knex.schema.hasColumn(e.$entityName, colName)) {
|
|
344
|
-
await logSql(this.knex.schema.alterTable(e.$entityName, b => {
|
|
359
|
+
if (!(await this.knex.schema.hasColumn(e.$entityName, colName))) {
|
|
360
|
+
await logSql(this.knex.schema.alterTable(e.$entityName, (b) => {
|
|
345
361
|
buildColumn(col, colName, b, supportsJson(this.knex));
|
|
346
362
|
}));
|
|
347
363
|
}
|
|
@@ -364,7 +380,7 @@ export class KnexSchemaBuilder {
|
|
|
364
380
|
KnexSchemaBuilder.logToConsole = true;
|
|
365
381
|
function supportsJson(knex) {
|
|
366
382
|
const client = knex.client.config.client;
|
|
367
|
-
if (client?.includes(
|
|
383
|
+
if (client?.includes('sqlite3') || client?.includes('mssql'))
|
|
368
384
|
return false;
|
|
369
385
|
return true;
|
|
370
386
|
}
|
|
@@ -376,7 +392,7 @@ export function buildColumn(x, dbName, b, supportsJson = true) {
|
|
|
376
392
|
c.defaultTo(0).notNullable();
|
|
377
393
|
}
|
|
378
394
|
}
|
|
379
|
-
else if (x.valueConverter.fieldTypeInDb ==
|
|
395
|
+
else if (x.valueConverter.fieldTypeInDb == 'integer') {
|
|
380
396
|
let c = b.integer(dbName);
|
|
381
397
|
if (!x.allowNull) {
|
|
382
398
|
c.defaultTo(0).notNullable();
|
|
@@ -391,7 +407,7 @@ export function buildColumn(x, dbName, b, supportsJson = true) {
|
|
|
391
407
|
b.date(dbName);
|
|
392
408
|
else
|
|
393
409
|
b.dateTime(dbName);
|
|
394
|
-
else if (x.valueConverter.fieldTypeInDb ==
|
|
410
|
+
else if (x.valueConverter.fieldTypeInDb == 'date')
|
|
395
411
|
b.date(dbName);
|
|
396
412
|
else
|
|
397
413
|
b.specificType(dbName, x.valueConverter.fieldTypeInDb);
|
|
@@ -402,13 +418,13 @@ export function buildColumn(x, dbName, b, supportsJson = true) {
|
|
|
402
418
|
c.defaultTo(false).notNullable();
|
|
403
419
|
}
|
|
404
420
|
else if (x.valueConverter.fieldTypeInDb) {
|
|
405
|
-
if (x.valueConverter.fieldTypeInDb ==
|
|
421
|
+
if (x.valueConverter.fieldTypeInDb == 'integer') {
|
|
406
422
|
let c = b.integer(dbName);
|
|
407
423
|
if (!x.allowNull) {
|
|
408
424
|
c.defaultTo(0).notNullable();
|
|
409
425
|
}
|
|
410
426
|
}
|
|
411
|
-
else if (x.valueConverter.fieldTypeInDb ==
|
|
427
|
+
else if (x.valueConverter.fieldTypeInDb == 'json')
|
|
412
428
|
if (supportsJson)
|
|
413
429
|
b.json(dbName);
|
|
414
430
|
else
|
package/esm/remult-mongo.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { CompoundIdField, Filter } from '.';
|
|
2
|
-
import { dbNamesOf } from './src/filter/filter-consumer-bridge-to-sql-request';
|
|
3
|
-
import { getRepository } from './src/remult3';
|
|
1
|
+
import { CompoundIdField, Filter, } from '.';
|
|
2
|
+
import { dbNamesOf, } from './src/filter/filter-consumer-bridge-to-sql-request';
|
|
3
|
+
import { getRepository, } from './src/remult3';
|
|
4
4
|
import { remult as remultContext } from './src/remult-proxy';
|
|
5
5
|
export class MongoDataProvider {
|
|
6
6
|
constructor(db, client, options) {
|
|
@@ -13,38 +13,43 @@ export class MongoDataProvider {
|
|
|
13
13
|
static getDb(remult) {
|
|
14
14
|
const r = (remult || remultContext).dataProvider;
|
|
15
15
|
if (!r.db)
|
|
16
|
-
throw
|
|
16
|
+
throw 'the data provider is not a MongoDataProvider';
|
|
17
17
|
return { db: r.db, session: r.session };
|
|
18
18
|
}
|
|
19
19
|
getEntityDataProvider(entity) {
|
|
20
20
|
return new MongoEntityDataProvider(this.db, entity, this.session);
|
|
21
21
|
}
|
|
22
22
|
async transaction(action) {
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
const db = this.client.db(this.db.databaseName);
|
|
26
|
-
try {
|
|
27
|
-
await action(new MongoDataProvider(db, undefined, { session }));
|
|
28
|
-
await session.commitTransaction();
|
|
23
|
+
if (this.disableTransactions) {
|
|
24
|
+
await action(this);
|
|
29
25
|
}
|
|
30
|
-
|
|
31
|
-
await
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
26
|
+
else {
|
|
27
|
+
let session = await this.client.startSession();
|
|
28
|
+
session.startTransaction();
|
|
29
|
+
const db = this.client.db(this.db.databaseName);
|
|
30
|
+
try {
|
|
31
|
+
await action(new MongoDataProvider(db, undefined, { session }));
|
|
32
|
+
await session.commitTransaction();
|
|
33
|
+
}
|
|
34
|
+
catch (err) {
|
|
35
|
+
await session.abortTransaction();
|
|
36
|
+
throw err;
|
|
37
|
+
}
|
|
38
|
+
finally {
|
|
39
|
+
await session.endSession();
|
|
40
|
+
}
|
|
36
41
|
}
|
|
37
42
|
}
|
|
38
43
|
static async filterToRaw(entity, condition) {
|
|
39
44
|
const repo = getRepository(entity);
|
|
40
45
|
var b = new FilterConsumerBridgeToMongo(await dbNamesOf(repo.metadata));
|
|
41
46
|
b._addWhere = false;
|
|
42
|
-
await (await
|
|
47
|
+
await (await repo.translateWhereToFilter(condition)).__applyToConsumer(b);
|
|
43
48
|
let r = await b.resolveWhere();
|
|
44
49
|
return r;
|
|
45
50
|
}
|
|
46
51
|
}
|
|
47
|
-
const NULL = { $null:
|
|
52
|
+
const NULL = { $null: '$null' };
|
|
48
53
|
function isNull(x) {
|
|
49
54
|
return x?.$null === NULL.$null;
|
|
50
55
|
}
|
|
@@ -88,7 +93,7 @@ class MongoEntityDataProvider {
|
|
|
88
93
|
options.where.__applyToConsumer(x);
|
|
89
94
|
let where = await x.resolveWhere();
|
|
90
95
|
let op = {
|
|
91
|
-
session: this.session
|
|
96
|
+
session: this.session,
|
|
92
97
|
};
|
|
93
98
|
if (options.limit) {
|
|
94
99
|
op.limit = options.limit;
|
|
@@ -102,7 +107,10 @@ class MongoEntityDataProvider {
|
|
|
102
107
|
op.sort[e.$dbNameOf(s.field)] = s.isDescending ? -1 : 1;
|
|
103
108
|
}
|
|
104
109
|
}
|
|
105
|
-
return await Promise.all(await collection
|
|
110
|
+
return await Promise.all(await collection
|
|
111
|
+
.find(where, op)
|
|
112
|
+
.map((x) => this.translateFromJson(x, e))
|
|
113
|
+
.toArray());
|
|
106
114
|
}
|
|
107
115
|
async update(id, data) {
|
|
108
116
|
let { collection, e } = await this.collection();
|
|
@@ -126,9 +134,11 @@ class MongoEntityDataProvider {
|
|
|
126
134
|
}
|
|
127
135
|
}
|
|
128
136
|
let r = await collection.updateOne(await f.resolveWhere(), {
|
|
129
|
-
$set: newR
|
|
137
|
+
$set: newR,
|
|
130
138
|
}, { session: this.session });
|
|
131
|
-
return this.find({
|
|
139
|
+
return this.find({
|
|
140
|
+
where: Filter.fromEntityFilter(this.entity, resultFilter),
|
|
141
|
+
}).then((y) => y[0]);
|
|
132
142
|
}
|
|
133
143
|
async delete(id) {
|
|
134
144
|
const { e, collection } = await this.collection();
|
|
@@ -138,7 +148,9 @@ class MongoEntityDataProvider {
|
|
|
138
148
|
}
|
|
139
149
|
async insert(data) {
|
|
140
150
|
let { collection, e } = await this.collection();
|
|
141
|
-
let r = await collection.insertOne(await this.translateToJson(data, e), {
|
|
151
|
+
let r = await collection.insertOne(await this.translateToJson(data, e), {
|
|
152
|
+
session: this.session,
|
|
153
|
+
});
|
|
142
154
|
return await this.translateFromJson(await collection.findOne({ _id: r.insertedId }, { session: this.session }), e);
|
|
143
155
|
}
|
|
144
156
|
async collection() {
|
|
@@ -163,12 +175,12 @@ class FilterConsumerBridgeToMongo {
|
|
|
163
175
|
}
|
|
164
176
|
}
|
|
165
177
|
if (this.result.length > 0)
|
|
166
|
-
return { $and: this.result.map(x => x()) };
|
|
178
|
+
return { $and: this.result.map((x) => x()) };
|
|
167
179
|
else
|
|
168
180
|
return {};
|
|
169
181
|
}
|
|
170
182
|
custom(key, customItem) {
|
|
171
|
-
throw new Error(
|
|
183
|
+
throw new Error('Custom filter should be translated before it gets here');
|
|
172
184
|
}
|
|
173
185
|
or(orElements) {
|
|
174
186
|
this.promises.push((async () => {
|
|
@@ -185,43 +197,43 @@ class FilterConsumerBridgeToMongo {
|
|
|
185
197
|
return; //since empty or is all rows;
|
|
186
198
|
}
|
|
187
199
|
this.result.push(() => ({
|
|
188
|
-
$or: result
|
|
200
|
+
$or: result,
|
|
189
201
|
}));
|
|
190
202
|
})());
|
|
191
203
|
}
|
|
192
204
|
isNull(col) {
|
|
193
|
-
this.add(col, NULL,
|
|
205
|
+
this.add(col, NULL, '$eq');
|
|
194
206
|
}
|
|
195
207
|
isNotNull(col) {
|
|
196
|
-
this.add(col, NULL,
|
|
208
|
+
this.add(col, NULL, '$ne');
|
|
197
209
|
}
|
|
198
210
|
isIn(col, val) {
|
|
199
211
|
this.result.push(() => ({
|
|
200
212
|
[this.nameProvider.$dbNameOf(col)]: {
|
|
201
|
-
$in: val.map(x => col.valueConverter.toDb(x))
|
|
202
|
-
}
|
|
213
|
+
$in: val.map((x) => col.valueConverter.toDb(x)),
|
|
214
|
+
},
|
|
203
215
|
}));
|
|
204
216
|
}
|
|
205
217
|
isEqualTo(col, val) {
|
|
206
|
-
this.add(col, val,
|
|
218
|
+
this.add(col, val, '$eq');
|
|
207
219
|
}
|
|
208
220
|
isDifferentFrom(col, val) {
|
|
209
|
-
this.add(col, val,
|
|
221
|
+
this.add(col, val, '$ne');
|
|
210
222
|
}
|
|
211
223
|
isGreaterOrEqualTo(col, val) {
|
|
212
|
-
this.add(col, val,
|
|
224
|
+
this.add(col, val, '$gte');
|
|
213
225
|
}
|
|
214
226
|
isGreaterThan(col, val) {
|
|
215
|
-
this.add(col, val,
|
|
227
|
+
this.add(col, val, '$gt');
|
|
216
228
|
}
|
|
217
229
|
isLessOrEqualTo(col, val) {
|
|
218
|
-
this.add(col, val,
|
|
230
|
+
this.add(col, val, '$lte');
|
|
219
231
|
}
|
|
220
232
|
isLessThan(col, val) {
|
|
221
|
-
this.add(col, val,
|
|
233
|
+
this.add(col, val, '$lt');
|
|
222
234
|
}
|
|
223
235
|
containsCaseInsensitive(col, val) {
|
|
224
|
-
throw
|
|
236
|
+
throw 'containsCaseInsensitive not yet implemented';
|
|
225
237
|
// this.promises.push(col.getDbName().then(colName => {
|
|
226
238
|
// this.result.push(b => b.whereRaw(
|
|
227
239
|
// 'lower (' + colName + ") like lower ('%" + val.replace(/'/g, '\'\'') + "%')"));
|
|
@@ -229,11 +241,13 @@ class FilterConsumerBridgeToMongo {
|
|
|
229
241
|
}
|
|
230
242
|
add(col, val, operator) {
|
|
231
243
|
this.result.push(() => ({
|
|
232
|
-
[this.nameProvider.$dbNameOf(col)]: {
|
|
244
|
+
[this.nameProvider.$dbNameOf(col)]: {
|
|
245
|
+
[operator]: isNull(val) ? val : col.valueConverter.toDb(val),
|
|
246
|
+
},
|
|
233
247
|
}));
|
|
234
248
|
}
|
|
235
249
|
databaseCustom(databaseCustom) {
|
|
236
|
-
throw
|
|
250
|
+
throw 'error';
|
|
237
251
|
// this.promises.push((async () => {
|
|
238
252
|
// if (databaseCustom?.buildSql) {
|
|
239
253
|
// let item = new CustomSqlFilterBuilder(this.knex);
|
package/esm/remult-next.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/// <reference types="node" />
|
|
2
|
-
import type { GetServerSideProps, NextApiRequest, PreviewData, NextApiHandler } from
|
|
3
|
-
import type { ParsedUrlQuery } from
|
|
4
|
-
import { RemultServerCore, RemultServerOptions } from
|
|
2
|
+
import type { GetServerSideProps, NextApiRequest, PreviewData, NextApiHandler } from 'next';
|
|
3
|
+
import type { ParsedUrlQuery } from 'querystring';
|
|
4
|
+
import { RemultServerCore, RemultServerOptions } from './server';
|
|
5
5
|
export declare function remultNext(options?: RemultServerOptions<NextApiRequest>): RemultNextServer;
|
|
6
6
|
export declare type RemultNextServer = RemultServerCore<NextApiRequest> & NextApiHandler & {
|
|
7
7
|
getServerSideProps<P extends {
|
package/esm/remult-next.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { createRemultServer } from
|
|
1
|
+
import { createRemultServer, } from './server';
|
|
2
2
|
export function remultNext(options) {
|
|
3
3
|
let result = createRemultServer(options, {
|
|
4
|
-
buildGenericRequestInfo: req => req,
|
|
5
|
-
getRequestBody: async (req) => req.body
|
|
4
|
+
buildGenericRequestInfo: (req) => req,
|
|
5
|
+
getRequestBody: async (req) => req.body,
|
|
6
6
|
});
|
|
7
7
|
return Object.assign((req, res) => result.handle(req, res).then(() => { }), result, {
|
|
8
8
|
getRemult: (req) => result.getRemult(req),
|
|
@@ -32,19 +32,20 @@ export function remultNext(options) {
|
|
|
32
32
|
});
|
|
33
33
|
});
|
|
34
34
|
};
|
|
35
|
-
}
|
|
35
|
+
},
|
|
36
36
|
});
|
|
37
37
|
}
|
|
38
38
|
const encoder = new TextEncoder();
|
|
39
39
|
export function remultNextApp(options) {
|
|
40
40
|
let result = createRemultServer(options, {
|
|
41
|
-
getRequestBody: req => req.json(),
|
|
41
|
+
getRequestBody: (req) => req.json(),
|
|
42
42
|
buildGenericRequestInfo: (req) => ({
|
|
43
43
|
url: req?.url,
|
|
44
44
|
method: req?.method,
|
|
45
45
|
on: (e, do1) => {
|
|
46
|
-
if (e ===
|
|
47
|
-
|
|
46
|
+
if (e === 'close') {
|
|
47
|
+
;
|
|
48
|
+
req['_tempOnClose'] = do1;
|
|
48
49
|
}
|
|
49
50
|
},
|
|
50
51
|
}),
|
|
@@ -52,7 +53,7 @@ export function remultNextApp(options) {
|
|
|
52
53
|
const handler = async (req) => {
|
|
53
54
|
{
|
|
54
55
|
let sseResponse = undefined;
|
|
55
|
-
req[
|
|
56
|
+
req['_tempOnClose'] = () => { };
|
|
56
57
|
const response = {
|
|
57
58
|
end: () => { },
|
|
58
59
|
json: () => { },
|
|
@@ -62,8 +63,8 @@ export function remultNextApp(options) {
|
|
|
62
63
|
write: () => { },
|
|
63
64
|
writeHead: (status, headers) => {
|
|
64
65
|
if (status === 200 && headers) {
|
|
65
|
-
const contentType = headers[
|
|
66
|
-
if (contentType ===
|
|
66
|
+
const contentType = headers['Content-Type'];
|
|
67
|
+
if (contentType === 'text/event-stream') {
|
|
67
68
|
const messages = [];
|
|
68
69
|
response.write = (x) => messages.push(x);
|
|
69
70
|
const stream = new ReadableStream({
|
|
@@ -77,7 +78,7 @@ export function remultNextApp(options) {
|
|
|
77
78
|
},
|
|
78
79
|
cancel: () => {
|
|
79
80
|
response.write = () => { };
|
|
80
|
-
req[
|
|
81
|
+
req['_tempOnClose']();
|
|
81
82
|
},
|
|
82
83
|
});
|
|
83
84
|
sseResponse = new Response(stream, { headers });
|
|
@@ -94,6 +95,11 @@ export function remultNextApp(options) {
|
|
|
94
95
|
status: responseFromRemultHandler.statusCode,
|
|
95
96
|
});
|
|
96
97
|
}
|
|
98
|
+
if (!responseFromRemultHandler) {
|
|
99
|
+
return new Response('', {
|
|
100
|
+
status: 404,
|
|
101
|
+
});
|
|
102
|
+
}
|
|
97
103
|
}
|
|
98
104
|
};
|
|
99
105
|
return {
|