remult 0.21.1 → 0.22.0
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 +36 -27
- 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 +1 -1
- package/esm/src/backend-tests/backend-database-test-setup.backend-spec.js +47 -38
- 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 +8 -8
- package/esm/src/shared-tests/db-tests-setup.js +10 -10
- package/esm/src/shared-tests/db-tests.db-tests.d.ts +1 -1
- package/esm/src/shared-tests/db-tests.db-tests.js +279 -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 +14 -14
- 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 +33 -23
- 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 +1 -1
- package/src/backend-tests/backend-database-test-setup.backend-spec.js +40 -31
- 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 +8 -8
- package/src/shared-tests/db-tests-setup.js +6 -6
- package/src/shared-tests/db-tests.db-tests.d.ts +1 -1
- package/src/shared-tests/db-tests.db-tests.js +350 -153
- 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 +8 -8
- 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,7 +13,7 @@ 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) {
|
|
@@ -39,12 +39,12 @@ export class MongoDataProvider {
|
|
|
39
39
|
const repo = getRepository(entity);
|
|
40
40
|
var b = new FilterConsumerBridgeToMongo(await dbNamesOf(repo.metadata));
|
|
41
41
|
b._addWhere = false;
|
|
42
|
-
await (await
|
|
42
|
+
await (await repo.translateWhereToFilter(condition)).__applyToConsumer(b);
|
|
43
43
|
let r = await b.resolveWhere();
|
|
44
44
|
return r;
|
|
45
45
|
}
|
|
46
46
|
}
|
|
47
|
-
const NULL = { $null:
|
|
47
|
+
const NULL = { $null: '$null' };
|
|
48
48
|
function isNull(x) {
|
|
49
49
|
return x?.$null === NULL.$null;
|
|
50
50
|
}
|
|
@@ -88,7 +88,7 @@ class MongoEntityDataProvider {
|
|
|
88
88
|
options.where.__applyToConsumer(x);
|
|
89
89
|
let where = await x.resolveWhere();
|
|
90
90
|
let op = {
|
|
91
|
-
session: this.session
|
|
91
|
+
session: this.session,
|
|
92
92
|
};
|
|
93
93
|
if (options.limit) {
|
|
94
94
|
op.limit = options.limit;
|
|
@@ -102,7 +102,10 @@ class MongoEntityDataProvider {
|
|
|
102
102
|
op.sort[e.$dbNameOf(s.field)] = s.isDescending ? -1 : 1;
|
|
103
103
|
}
|
|
104
104
|
}
|
|
105
|
-
return await Promise.all(await collection
|
|
105
|
+
return await Promise.all(await collection
|
|
106
|
+
.find(where, op)
|
|
107
|
+
.map((x) => this.translateFromJson(x, e))
|
|
108
|
+
.toArray());
|
|
106
109
|
}
|
|
107
110
|
async update(id, data) {
|
|
108
111
|
let { collection, e } = await this.collection();
|
|
@@ -126,9 +129,11 @@ class MongoEntityDataProvider {
|
|
|
126
129
|
}
|
|
127
130
|
}
|
|
128
131
|
let r = await collection.updateOne(await f.resolveWhere(), {
|
|
129
|
-
$set: newR
|
|
132
|
+
$set: newR,
|
|
130
133
|
}, { session: this.session });
|
|
131
|
-
return this.find({
|
|
134
|
+
return this.find({
|
|
135
|
+
where: Filter.fromEntityFilter(this.entity, resultFilter),
|
|
136
|
+
}).then((y) => y[0]);
|
|
132
137
|
}
|
|
133
138
|
async delete(id) {
|
|
134
139
|
const { e, collection } = await this.collection();
|
|
@@ -138,7 +143,9 @@ class MongoEntityDataProvider {
|
|
|
138
143
|
}
|
|
139
144
|
async insert(data) {
|
|
140
145
|
let { collection, e } = await this.collection();
|
|
141
|
-
let r = await collection.insertOne(await this.translateToJson(data, e), {
|
|
146
|
+
let r = await collection.insertOne(await this.translateToJson(data, e), {
|
|
147
|
+
session: this.session,
|
|
148
|
+
});
|
|
142
149
|
return await this.translateFromJson(await collection.findOne({ _id: r.insertedId }, { session: this.session }), e);
|
|
143
150
|
}
|
|
144
151
|
async collection() {
|
|
@@ -163,12 +170,12 @@ class FilterConsumerBridgeToMongo {
|
|
|
163
170
|
}
|
|
164
171
|
}
|
|
165
172
|
if (this.result.length > 0)
|
|
166
|
-
return { $and: this.result.map(x => x()) };
|
|
173
|
+
return { $and: this.result.map((x) => x()) };
|
|
167
174
|
else
|
|
168
175
|
return {};
|
|
169
176
|
}
|
|
170
177
|
custom(key, customItem) {
|
|
171
|
-
throw new Error(
|
|
178
|
+
throw new Error('Custom filter should be translated before it gets here');
|
|
172
179
|
}
|
|
173
180
|
or(orElements) {
|
|
174
181
|
this.promises.push((async () => {
|
|
@@ -185,43 +192,43 @@ class FilterConsumerBridgeToMongo {
|
|
|
185
192
|
return; //since empty or is all rows;
|
|
186
193
|
}
|
|
187
194
|
this.result.push(() => ({
|
|
188
|
-
$or: result
|
|
195
|
+
$or: result,
|
|
189
196
|
}));
|
|
190
197
|
})());
|
|
191
198
|
}
|
|
192
199
|
isNull(col) {
|
|
193
|
-
this.add(col, NULL,
|
|
200
|
+
this.add(col, NULL, '$eq');
|
|
194
201
|
}
|
|
195
202
|
isNotNull(col) {
|
|
196
|
-
this.add(col, NULL,
|
|
203
|
+
this.add(col, NULL, '$ne');
|
|
197
204
|
}
|
|
198
205
|
isIn(col, val) {
|
|
199
206
|
this.result.push(() => ({
|
|
200
207
|
[this.nameProvider.$dbNameOf(col)]: {
|
|
201
|
-
$in: val.map(x => col.valueConverter.toDb(x))
|
|
202
|
-
}
|
|
208
|
+
$in: val.map((x) => col.valueConverter.toDb(x)),
|
|
209
|
+
},
|
|
203
210
|
}));
|
|
204
211
|
}
|
|
205
212
|
isEqualTo(col, val) {
|
|
206
|
-
this.add(col, val,
|
|
213
|
+
this.add(col, val, '$eq');
|
|
207
214
|
}
|
|
208
215
|
isDifferentFrom(col, val) {
|
|
209
|
-
this.add(col, val,
|
|
216
|
+
this.add(col, val, '$ne');
|
|
210
217
|
}
|
|
211
218
|
isGreaterOrEqualTo(col, val) {
|
|
212
|
-
this.add(col, val,
|
|
219
|
+
this.add(col, val, '$gte');
|
|
213
220
|
}
|
|
214
221
|
isGreaterThan(col, val) {
|
|
215
|
-
this.add(col, val,
|
|
222
|
+
this.add(col, val, '$gt');
|
|
216
223
|
}
|
|
217
224
|
isLessOrEqualTo(col, val) {
|
|
218
|
-
this.add(col, val,
|
|
225
|
+
this.add(col, val, '$lte');
|
|
219
226
|
}
|
|
220
227
|
isLessThan(col, val) {
|
|
221
|
-
this.add(col, val,
|
|
228
|
+
this.add(col, val, '$lt');
|
|
222
229
|
}
|
|
223
230
|
containsCaseInsensitive(col, val) {
|
|
224
|
-
throw
|
|
231
|
+
throw 'containsCaseInsensitive not yet implemented';
|
|
225
232
|
// this.promises.push(col.getDbName().then(colName => {
|
|
226
233
|
// this.result.push(b => b.whereRaw(
|
|
227
234
|
// 'lower (' + colName + ") like lower ('%" + val.replace(/'/g, '\'\'') + "%')"));
|
|
@@ -229,11 +236,13 @@ class FilterConsumerBridgeToMongo {
|
|
|
229
236
|
}
|
|
230
237
|
add(col, val, operator) {
|
|
231
238
|
this.result.push(() => ({
|
|
232
|
-
[this.nameProvider.$dbNameOf(col)]: {
|
|
239
|
+
[this.nameProvider.$dbNameOf(col)]: {
|
|
240
|
+
[operator]: isNull(val) ? val : col.valueConverter.toDb(val),
|
|
241
|
+
},
|
|
233
242
|
}));
|
|
234
243
|
}
|
|
235
244
|
databaseCustom(databaseCustom) {
|
|
236
|
-
throw
|
|
245
|
+
throw 'error';
|
|
237
246
|
// this.promises.push((async () => {
|
|
238
247
|
// if (databaseCustom?.buildSql) {
|
|
239
248
|
// 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 {
|
package/esm/remult-sveltekit.js
CHANGED
|
@@ -1,21 +1,21 @@
|
|
|
1
|
-
import { createRemultServer } from './server';
|
|
1
|
+
import { createRemultServer, } from './server';
|
|
2
2
|
export function remultSveltekit(options) {
|
|
3
3
|
let result = createRemultServer(options, {
|
|
4
|
-
buildGenericRequestInfo: event => ({
|
|
4
|
+
buildGenericRequestInfo: (event) => ({
|
|
5
5
|
url: event.request.url,
|
|
6
6
|
method: event.request.method,
|
|
7
7
|
on: (e, do1) => {
|
|
8
8
|
if (e === 'close') {
|
|
9
|
-
event.locals[
|
|
9
|
+
event.locals['_tempOnClose'] = do1;
|
|
10
10
|
}
|
|
11
|
-
}
|
|
11
|
+
},
|
|
12
12
|
}),
|
|
13
|
-
getRequestBody: event => event.request.json()
|
|
13
|
+
getRequestBody: (event) => event.request.json(),
|
|
14
14
|
});
|
|
15
15
|
const handler = async ({ event, resolve }) => {
|
|
16
16
|
if (event.url.pathname.startsWith(options.rootPath)) {
|
|
17
17
|
let sseResponse = undefined;
|
|
18
|
-
event.locals[
|
|
18
|
+
event.locals['_tempOnClose'] = () => { };
|
|
19
19
|
const response = {
|
|
20
20
|
end: () => { },
|
|
21
21
|
json: () => { },
|
|
@@ -40,13 +40,13 @@ export function remultSveltekit(options) {
|
|
|
40
40
|
},
|
|
41
41
|
cancel: () => {
|
|
42
42
|
response.write = () => { };
|
|
43
|
-
event.locals[
|
|
44
|
-
}
|
|
43
|
+
event.locals['_tempOnClose']();
|
|
44
|
+
},
|
|
45
45
|
});
|
|
46
46
|
sseResponse = new Response(stream, { headers });
|
|
47
47
|
}
|
|
48
48
|
}
|
|
49
|
-
}
|
|
49
|
+
},
|
|
50
50
|
};
|
|
51
51
|
const responseFromRemultHandler = await result.handle(event, response);
|
|
52
52
|
if (sseResponse !== undefined) {
|
|
@@ -54,7 +54,7 @@ export function remultSveltekit(options) {
|
|
|
54
54
|
}
|
|
55
55
|
if (responseFromRemultHandler) {
|
|
56
56
|
return new Response(JSON.stringify(responseFromRemultHandler.data), {
|
|
57
|
-
status: responseFromRemultHandler.statusCode
|
|
57
|
+
status: responseFromRemultHandler.statusCode,
|
|
58
58
|
});
|
|
59
59
|
}
|
|
60
60
|
}
|
|
@@ -20,5 +20,7 @@ export class JsonEntityFileStorage {
|
|
|
20
20
|
}
|
|
21
21
|
}
|
|
22
22
|
export class JsonFileDataProvider extends JsonDataProvider {
|
|
23
|
-
constructor(folderPath) {
|
|
23
|
+
constructor(folderPath) {
|
|
24
|
+
super(new JsonEntityFileStorage(folderPath));
|
|
25
|
+
}
|
|
24
26
|
}
|