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
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import { getEntityMetadata } from
|
|
2
|
-
import { SqlDatabase } from
|
|
1
|
+
import { getEntityMetadata, } from '../remult3';
|
|
2
|
+
import { SqlDatabase } from '../data-providers/sql-database';
|
|
3
3
|
export class FilterConsumerBridgeToSqlRequest {
|
|
4
4
|
constructor(r, nameProvider) {
|
|
5
5
|
this.r = r;
|
|
6
6
|
this.nameProvider = nameProvider;
|
|
7
|
-
this.where =
|
|
7
|
+
this.where = '';
|
|
8
8
|
this._addWhere = true;
|
|
9
9
|
this.promises = [];
|
|
10
10
|
}
|
|
@@ -19,7 +19,7 @@ export class FilterConsumerBridgeToSqlRequest {
|
|
|
19
19
|
return this.where;
|
|
20
20
|
}
|
|
21
21
|
custom(key, customItem) {
|
|
22
|
-
throw new Error(
|
|
22
|
+
throw new Error('Custom filter should be translated before it gets here');
|
|
23
23
|
}
|
|
24
24
|
or(orElements) {
|
|
25
25
|
let statement = '';
|
|
@@ -33,16 +33,16 @@ export class FilterConsumerBridgeToSqlRequest {
|
|
|
33
33
|
return; //since if any member of or is empty, then the entire or is irrelevant
|
|
34
34
|
if (where.length > 0) {
|
|
35
35
|
if (statement.length > 0) {
|
|
36
|
-
statement +=
|
|
36
|
+
statement += ' or ';
|
|
37
37
|
}
|
|
38
38
|
if (orElements.length > 1) {
|
|
39
|
-
statement +=
|
|
39
|
+
statement += '(' + where + ')';
|
|
40
40
|
}
|
|
41
41
|
else
|
|
42
42
|
statement += where;
|
|
43
43
|
}
|
|
44
44
|
}
|
|
45
|
-
this.addToWhere(
|
|
45
|
+
this.addToWhere('(' + statement + ')');
|
|
46
46
|
})());
|
|
47
47
|
}
|
|
48
48
|
isNull(col) {
|
|
@@ -54,37 +54,50 @@ export class FilterConsumerBridgeToSqlRequest {
|
|
|
54
54
|
isIn(col, val) {
|
|
55
55
|
this.promises.push((async () => {
|
|
56
56
|
if (val && val.length > 0)
|
|
57
|
-
this.addToWhere(this.nameProvider.$dbNameOf(col) +
|
|
57
|
+
this.addToWhere(this.nameProvider.$dbNameOf(col) +
|
|
58
|
+
' in (' +
|
|
59
|
+
val
|
|
60
|
+
.map((x) => this.r.addParameterAndReturnSqlToken(col.valueConverter.toDb(x)))
|
|
61
|
+
.join(',') +
|
|
62
|
+
')');
|
|
58
63
|
else
|
|
59
64
|
this.addToWhere('1 = 0 /*isIn with no values*/');
|
|
60
65
|
})());
|
|
61
66
|
}
|
|
62
67
|
isEqualTo(col, val) {
|
|
63
|
-
this.add(col, val,
|
|
68
|
+
this.add(col, val, '=');
|
|
64
69
|
}
|
|
65
70
|
isDifferentFrom(col, val) {
|
|
66
|
-
this.add(col, val,
|
|
71
|
+
this.add(col, val, '<>');
|
|
67
72
|
}
|
|
68
73
|
isGreaterOrEqualTo(col, val) {
|
|
69
|
-
this.add(col, val,
|
|
74
|
+
this.add(col, val, '>=');
|
|
70
75
|
}
|
|
71
76
|
isGreaterThan(col, val) {
|
|
72
|
-
this.add(col, val,
|
|
77
|
+
this.add(col, val, '>');
|
|
73
78
|
}
|
|
74
79
|
isLessOrEqualTo(col, val) {
|
|
75
|
-
this.add(col, val,
|
|
80
|
+
this.add(col, val, '<=');
|
|
76
81
|
}
|
|
77
82
|
isLessThan(col, val) {
|
|
78
|
-
this.add(col, val,
|
|
83
|
+
this.add(col, val, '<');
|
|
79
84
|
}
|
|
80
85
|
containsCaseInsensitive(col, val) {
|
|
81
86
|
this.promises.push((async () => {
|
|
82
|
-
this.addToWhere('lower (' +
|
|
87
|
+
this.addToWhere('lower (' +
|
|
88
|
+
this.nameProvider.$dbNameOf(col) +
|
|
89
|
+
") like lower ('%" +
|
|
90
|
+
val.replace(/'/g, "''") +
|
|
91
|
+
"%')");
|
|
83
92
|
})());
|
|
84
93
|
}
|
|
85
94
|
add(col, val, operator) {
|
|
86
95
|
this.promises.push((async () => {
|
|
87
|
-
let x = this.nameProvider.$dbNameOf(col) +
|
|
96
|
+
let x = this.nameProvider.$dbNameOf(col) +
|
|
97
|
+
' ' +
|
|
98
|
+
operator +
|
|
99
|
+
' ' +
|
|
100
|
+
this.r.addParameterAndReturnSqlToken(col.valueConverter.toDb(val));
|
|
88
101
|
this.addToWhere(x);
|
|
89
102
|
})());
|
|
90
103
|
}
|
|
@@ -103,7 +116,7 @@ export class FilterConsumerBridgeToSqlRequest {
|
|
|
103
116
|
let item = new CustomSqlFilterBuilder(this.r);
|
|
104
117
|
await databaseCustom.buildSql(item);
|
|
105
118
|
if (item.sql) {
|
|
106
|
-
this.addToWhere(
|
|
119
|
+
this.addToWhere('(' + item.sql + ')');
|
|
107
120
|
}
|
|
108
121
|
}
|
|
109
122
|
})());
|
|
@@ -124,7 +137,9 @@ export class CustomSqlFilterBuilder {
|
|
|
124
137
|
}
|
|
125
138
|
}
|
|
126
139
|
export function isDbReadonly(field, dbNames) {
|
|
127
|
-
return (field.dbReadOnly ||
|
|
140
|
+
return (field.dbReadOnly ||
|
|
141
|
+
field.isServerExpression ||
|
|
142
|
+
dbNames.$dbNameOf(field) != field.options.dbName);
|
|
128
143
|
}
|
|
129
144
|
export async function dbNamesOf(repo) {
|
|
130
145
|
var meta = getEntityMetadata(repo);
|
|
@@ -133,12 +148,12 @@ export async function dbNamesOf(repo) {
|
|
|
133
148
|
toString: () => result.$entityName,
|
|
134
149
|
$dbNameOf: (field) => {
|
|
135
150
|
var key;
|
|
136
|
-
if (typeof field ===
|
|
151
|
+
if (typeof field === 'string')
|
|
137
152
|
key = field;
|
|
138
153
|
else
|
|
139
154
|
key = field.key;
|
|
140
155
|
return result[key];
|
|
141
|
-
}
|
|
156
|
+
},
|
|
142
157
|
};
|
|
143
158
|
for (const field of meta.fields) {
|
|
144
159
|
result[field.key] = await field.getDbName();
|
|
@@ -1,13 +1,13 @@
|
|
|
1
|
-
import { FieldMetadata } from
|
|
2
|
-
import { Remult } from
|
|
3
|
-
import { EntityMetadata, EntityFilter } from
|
|
1
|
+
import { FieldMetadata } from '../column-interfaces';
|
|
2
|
+
import { Remult } from '../context';
|
|
3
|
+
import { EntityMetadata, EntityFilter } from '../remult3';
|
|
4
4
|
export declare class Filter {
|
|
5
5
|
private apply?;
|
|
6
6
|
constructor(apply?: (add: FilterConsumer) => void);
|
|
7
7
|
__applyToConsumer(add: FilterConsumer): void;
|
|
8
8
|
static resolve<entityType>(filter: EntityFilter<entityType> | (() => EntityFilter<entityType> | Promise<EntityFilter<entityType>>)): Promise<EntityFilter<entityType>>;
|
|
9
|
-
static createCustom<entityType>(rawFilterTranslator: (unused: never, r: Remult) => EntityFilter<entityType> | Promise<EntityFilter<entityType>>, key?: string): (() => EntityFilter<entityType>) &
|
|
10
|
-
static createCustom<entityType, argsType>(rawFilterTranslator: (args: argsType, r: Remult) => EntityFilter<entityType> | Promise<EntityFilter<entityType>>, key?: string): ((y: argsType) => EntityFilter<entityType>) &
|
|
9
|
+
static createCustom<entityType>(rawFilterTranslator: (unused: never, r: Remult) => EntityFilter<entityType> | Promise<EntityFilter<entityType>>, key?: string): (() => EntityFilter<entityType>) & customFilterInfo<entityType>;
|
|
10
|
+
static createCustom<entityType, argsType>(rawFilterTranslator: (args: argsType, r: Remult) => EntityFilter<entityType> | Promise<EntityFilter<entityType>>, key?: string): ((y: argsType) => EntityFilter<entityType>) & customFilterInfo<entityType>;
|
|
11
11
|
static fromEntityFilter<T>(entity: EntityMetadata<T>, whereItem: EntityFilter<T>): Filter;
|
|
12
12
|
toJson(): any;
|
|
13
13
|
static entityFilterToJson<T>(entityDefs: EntityMetadata<T>, where: EntityFilter<T>): any;
|
|
@@ -77,9 +77,9 @@ export declare function entityFilterToJson<T>(entityDefs: EntityMetadata<T>, whe
|
|
|
77
77
|
export declare function buildFilterFromRequestParameters(entity: EntityMetadata, filterInfo: {
|
|
78
78
|
get: (key: string) => any;
|
|
79
79
|
}): EntityFilter<any>;
|
|
80
|
-
export interface
|
|
80
|
+
export interface customFilterInfo<entityType> {
|
|
81
81
|
rawFilterInfo: {
|
|
82
82
|
key: string;
|
|
83
|
-
rawFilterTranslator: (args: any, r: Remult) =>
|
|
83
|
+
rawFilterTranslator: (args: any, r: Remult) => EntityFilter<entityType> | Promise<EntityFilter<entityType>>;
|
|
84
84
|
};
|
|
85
85
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { getEntityRef, getEntitySettings } from
|
|
1
|
+
import { getEntityRef, getEntitySettings, } from '../remult3';
|
|
2
2
|
export class Filter {
|
|
3
3
|
constructor(apply) {
|
|
4
4
|
this.apply = apply;
|
|
@@ -10,7 +10,7 @@ export class Filter {
|
|
|
10
10
|
this.apply(add);
|
|
11
11
|
}
|
|
12
12
|
static async resolve(filter) {
|
|
13
|
-
if (typeof filter ===
|
|
13
|
+
if (typeof filter === 'function')
|
|
14
14
|
return await filter();
|
|
15
15
|
return filter;
|
|
16
16
|
}
|
|
@@ -21,9 +21,9 @@ export class Filter {
|
|
|
21
21
|
if (x == undefined)
|
|
22
22
|
x = {};
|
|
23
23
|
if (!rawFilterInfo.key)
|
|
24
|
-
throw
|
|
24
|
+
throw 'Usage of custom filter before a key was assigned to it';
|
|
25
25
|
return {
|
|
26
|
-
[customUrlToken + rawFilterInfo.key]: x
|
|
26
|
+
[customUrlToken + rawFilterInfo.key]: x,
|
|
27
27
|
};
|
|
28
28
|
}, { rawFilterInfo });
|
|
29
29
|
}
|
|
@@ -33,19 +33,19 @@ export class Filter {
|
|
|
33
33
|
if (Object.prototype.hasOwnProperty.call(whereItem, key)) {
|
|
34
34
|
let fieldToFilter = whereItem[key];
|
|
35
35
|
{
|
|
36
|
-
if (key ==
|
|
37
|
-
result.push(new OrFilter(...fieldToFilter.map(x => Filter.fromEntityFilter(entity, x))));
|
|
36
|
+
if (key == '$or') {
|
|
37
|
+
result.push(new OrFilter(...fieldToFilter.map((x) => Filter.fromEntityFilter(entity, x))));
|
|
38
38
|
}
|
|
39
|
-
else if (key ==
|
|
40
|
-
result.push(new AndFilter(...fieldToFilter.map(x => Filter.fromEntityFilter(entity, x))));
|
|
39
|
+
else if (key == '$and') {
|
|
40
|
+
result.push(new AndFilter(...fieldToFilter.map((x) => Filter.fromEntityFilter(entity, x))));
|
|
41
41
|
}
|
|
42
42
|
else if (key.startsWith(customUrlToken)) {
|
|
43
|
-
result.push(new Filter(x => {
|
|
43
|
+
result.push(new Filter((x) => {
|
|
44
44
|
x.custom(key.substring(customUrlToken.length), fieldToFilter);
|
|
45
45
|
}));
|
|
46
46
|
}
|
|
47
47
|
else if (key == customDatabaseFilterToken) {
|
|
48
|
-
result.push(new Filter(x => x.databaseCustom(fieldToFilter)));
|
|
48
|
+
result.push(new Filter((x) => x.databaseCustom(fieldToFilter)));
|
|
49
49
|
}
|
|
50
50
|
else {
|
|
51
51
|
let fh = new filterHelper(entity.fields[key]);
|
|
@@ -57,29 +57,29 @@ export class Filter {
|
|
|
57
57
|
if (Object.prototype.hasOwnProperty.call(fieldToFilter, key)) {
|
|
58
58
|
const element = fieldToFilter[key];
|
|
59
59
|
switch (key) {
|
|
60
|
-
case
|
|
61
|
-
case
|
|
60
|
+
case '$gte':
|
|
61
|
+
case '>=':
|
|
62
62
|
result.push(fh.isGreaterOrEqualTo(element));
|
|
63
63
|
found = true;
|
|
64
64
|
break;
|
|
65
|
-
case
|
|
66
|
-
case
|
|
65
|
+
case '$gt':
|
|
66
|
+
case '>':
|
|
67
67
|
result.push(fh.isGreaterThan(element));
|
|
68
68
|
found = true;
|
|
69
69
|
break;
|
|
70
|
-
case
|
|
71
|
-
case
|
|
70
|
+
case '$lte':
|
|
71
|
+
case '<=':
|
|
72
72
|
result.push(fh.isLessOrEqualTo(element));
|
|
73
73
|
found = true;
|
|
74
74
|
break;
|
|
75
|
-
case
|
|
76
|
-
case
|
|
75
|
+
case '$lt':
|
|
76
|
+
case '<':
|
|
77
77
|
result.push(fh.isLessThan(element));
|
|
78
78
|
found = true;
|
|
79
79
|
break;
|
|
80
|
-
case
|
|
81
|
-
case
|
|
82
|
-
case
|
|
80
|
+
case '$ne':
|
|
81
|
+
case '!=':
|
|
82
|
+
case '$nin':
|
|
83
83
|
found = true;
|
|
84
84
|
if (Array.isArray(element)) {
|
|
85
85
|
result.push(fh.isNotIn(element));
|
|
@@ -87,11 +87,11 @@ export class Filter {
|
|
|
87
87
|
else
|
|
88
88
|
result.push(fh.isDifferentFrom(element));
|
|
89
89
|
break;
|
|
90
|
-
case
|
|
90
|
+
case '$in':
|
|
91
91
|
found = true;
|
|
92
92
|
result.push(fh.isIn(element));
|
|
93
93
|
break;
|
|
94
|
-
case
|
|
94
|
+
case '$contains':
|
|
95
95
|
found = true;
|
|
96
96
|
result.push(fh.contains(element));
|
|
97
97
|
break;
|
|
@@ -121,14 +121,18 @@ export class Filter {
|
|
|
121
121
|
return Filter.fromEntityFilter(entityDefs, where).toJson();
|
|
122
122
|
}
|
|
123
123
|
static entityFilterFromJson(entityDefs, packed) {
|
|
124
|
-
return buildFilterFromRequestParameters(entityDefs, {
|
|
124
|
+
return buildFilterFromRequestParameters(entityDefs, {
|
|
125
|
+
get: (key) => packed[key],
|
|
126
|
+
});
|
|
125
127
|
}
|
|
126
128
|
static async translateCustomWhere(r, entity, remult) {
|
|
127
129
|
let f = new customTranslator(async (filterKey, custom) => {
|
|
128
130
|
let r = [];
|
|
129
131
|
for (const key in entity.entityType) {
|
|
130
132
|
const element = entity.entityType[key];
|
|
131
|
-
if (element &&
|
|
133
|
+
if (element &&
|
|
134
|
+
element.rawFilterInfo &&
|
|
135
|
+
element.rawFilterInfo.rawFilterTranslator) {
|
|
132
136
|
if (element.rawFilterInfo.key == filterKey) {
|
|
133
137
|
r.push(await Filter.fromEntityFilter(entity, await element.rawFilterInfo.rawFilterTranslator(custom, remult)));
|
|
134
138
|
}
|
|
@@ -138,7 +142,7 @@ export class Filter {
|
|
|
138
142
|
});
|
|
139
143
|
r.__applyToConsumer(f);
|
|
140
144
|
await f.resolve();
|
|
141
|
-
r = new Filter(x => f.applyTo(x));
|
|
145
|
+
r = new Filter((x) => f.applyTo(x));
|
|
142
146
|
return r;
|
|
143
147
|
}
|
|
144
148
|
}
|
|
@@ -151,25 +155,25 @@ export class filterHelper {
|
|
|
151
155
|
if (ei) {
|
|
152
156
|
if (!val)
|
|
153
157
|
return null;
|
|
154
|
-
if (typeof val ===
|
|
158
|
+
if (typeof val === 'string' || typeof val === 'number')
|
|
155
159
|
return val;
|
|
156
160
|
return getEntityRef(val).getId();
|
|
157
161
|
}
|
|
158
162
|
return val;
|
|
159
163
|
}
|
|
160
164
|
contains(val) {
|
|
161
|
-
return new Filter(add => add.containsCaseInsensitive(this.metadata, val));
|
|
165
|
+
return new Filter((add) => add.containsCaseInsensitive(this.metadata, val));
|
|
162
166
|
}
|
|
163
167
|
isLessThan(val) {
|
|
164
168
|
val = this.processVal(val);
|
|
165
|
-
return new Filter(add => add.isLessThan(this.metadata, val));
|
|
169
|
+
return new Filter((add) => add.isLessThan(this.metadata, val));
|
|
166
170
|
}
|
|
167
171
|
isGreaterOrEqualTo(val) {
|
|
168
172
|
val = this.processVal(val);
|
|
169
|
-
return new Filter(add => add.isGreaterOrEqualTo(this.metadata, val));
|
|
173
|
+
return new Filter((add) => add.isGreaterOrEqualTo(this.metadata, val));
|
|
170
174
|
}
|
|
171
175
|
isNotIn(values) {
|
|
172
|
-
return new Filter(add => {
|
|
176
|
+
return new Filter((add) => {
|
|
173
177
|
for (const v of values) {
|
|
174
178
|
add.isDifferentFrom(this.metadata, this.processVal(v));
|
|
175
179
|
}
|
|
@@ -178,31 +182,31 @@ export class filterHelper {
|
|
|
178
182
|
isDifferentFrom(val) {
|
|
179
183
|
val = this.processVal(val);
|
|
180
184
|
if ((val === null || val === undefined) && this.metadata.allowNull)
|
|
181
|
-
return new Filter(add => add.isNotNull(this.metadata));
|
|
182
|
-
return new Filter(add => add.isDifferentFrom(this.metadata, val));
|
|
185
|
+
return new Filter((add) => add.isNotNull(this.metadata));
|
|
186
|
+
return new Filter((add) => add.isDifferentFrom(this.metadata, val));
|
|
183
187
|
}
|
|
184
188
|
isLessOrEqualTo(val) {
|
|
185
189
|
val = this.processVal(val);
|
|
186
|
-
return new Filter(add => add.isLessOrEqualTo(this.metadata, val));
|
|
190
|
+
return new Filter((add) => add.isLessOrEqualTo(this.metadata, val));
|
|
187
191
|
}
|
|
188
192
|
isGreaterThan(val) {
|
|
189
193
|
val = this.processVal(val);
|
|
190
|
-
return new Filter(add => add.isGreaterThan(this.metadata, val));
|
|
194
|
+
return new Filter((add) => add.isGreaterThan(this.metadata, val));
|
|
191
195
|
}
|
|
192
196
|
isEqualTo(val) {
|
|
193
197
|
val = this.processVal(val);
|
|
194
198
|
if ((val === null || val === undefined) && this.metadata.allowNull)
|
|
195
|
-
return new Filter(add => add.isNull(this.metadata));
|
|
196
|
-
return new Filter(add => add.isEqualTo(this.metadata, val));
|
|
199
|
+
return new Filter((add) => add.isNull(this.metadata));
|
|
200
|
+
return new Filter((add) => add.isEqualTo(this.metadata, val));
|
|
197
201
|
}
|
|
198
202
|
isIn(val) {
|
|
199
|
-
val = val.map(x => this.processVal(x));
|
|
200
|
-
return new Filter(add => add.isIn(this.metadata, val));
|
|
203
|
+
val = val.map((x) => this.processVal(x));
|
|
204
|
+
return new Filter((add) => add.isIn(this.metadata, val));
|
|
201
205
|
}
|
|
202
206
|
}
|
|
203
207
|
export class AndFilter extends Filter {
|
|
204
208
|
constructor(...filters) {
|
|
205
|
-
super(add => {
|
|
209
|
+
super((add) => {
|
|
206
210
|
for (const iterator of this.filters) {
|
|
207
211
|
if (iterator)
|
|
208
212
|
iterator.__applyToConsumer(add);
|
|
@@ -216,8 +220,8 @@ export class AndFilter extends Filter {
|
|
|
216
220
|
}
|
|
217
221
|
export class OrFilter extends Filter {
|
|
218
222
|
constructor(...filters) {
|
|
219
|
-
super(add => {
|
|
220
|
-
let f = this.filters.filter(x => x !== undefined);
|
|
223
|
+
super((add) => {
|
|
224
|
+
let f = this.filters.filter((x) => x !== undefined);
|
|
221
225
|
if (f.length > 1) {
|
|
222
226
|
add.or(f);
|
|
223
227
|
}
|
|
@@ -227,17 +231,20 @@ export class OrFilter extends Filter {
|
|
|
227
231
|
this.filters = filters;
|
|
228
232
|
}
|
|
229
233
|
}
|
|
230
|
-
export const customUrlToken =
|
|
231
|
-
export const customDatabaseFilterToken =
|
|
234
|
+
export const customUrlToken = '$custom$';
|
|
235
|
+
export const customDatabaseFilterToken = '$db$';
|
|
236
|
+
const customArrayToken = '$an array';
|
|
232
237
|
export class FilterSerializer {
|
|
233
238
|
constructor() {
|
|
234
239
|
this.result = {};
|
|
235
240
|
this.hasUndefined = false;
|
|
236
241
|
}
|
|
237
242
|
databaseCustom(databaseCustom) {
|
|
238
|
-
throw new Error(
|
|
243
|
+
throw new Error('database custom is not allowed with api calls.');
|
|
239
244
|
}
|
|
240
245
|
custom(key, customItem) {
|
|
246
|
+
if (Array.isArray(customItem))
|
|
247
|
+
customItem = { [customArrayToken]: customItem };
|
|
241
248
|
this.add(customUrlToken + key, customItem);
|
|
242
249
|
}
|
|
243
250
|
add(key, val) {
|
|
@@ -257,20 +264,20 @@ export class FilterSerializer {
|
|
|
257
264
|
r[key] = v;
|
|
258
265
|
}
|
|
259
266
|
or(orElements) {
|
|
260
|
-
this.add(
|
|
267
|
+
this.add('OR', orElements.map((x) => {
|
|
261
268
|
let f = new FilterSerializer();
|
|
262
269
|
x.__applyToConsumer(f);
|
|
263
270
|
return f.result;
|
|
264
271
|
}));
|
|
265
272
|
}
|
|
266
273
|
isNull(col) {
|
|
267
|
-
this.add(col.key +
|
|
274
|
+
this.add(col.key + '.null', true);
|
|
268
275
|
}
|
|
269
276
|
isNotNull(col) {
|
|
270
|
-
this.add(col.key +
|
|
277
|
+
this.add(col.key + '.null', false);
|
|
271
278
|
}
|
|
272
279
|
isIn(col, val) {
|
|
273
|
-
this.add(col.key +
|
|
280
|
+
this.add(col.key + '.in', val.map((x) => col.valueConverter.toJson(x)));
|
|
274
281
|
}
|
|
275
282
|
isEqualTo(col, val) {
|
|
276
283
|
this.add(col.key, col.valueConverter.toJson(val));
|
|
@@ -291,17 +298,17 @@ export class FilterSerializer {
|
|
|
291
298
|
this.add(col.key + '.lt', col.valueConverter.toJson(val));
|
|
292
299
|
}
|
|
293
300
|
containsCaseInsensitive(col, val) {
|
|
294
|
-
this.add(col.key +
|
|
301
|
+
this.add(col.key + '.contains', val);
|
|
295
302
|
}
|
|
296
303
|
}
|
|
297
304
|
export function entityFilterToJson(entityDefs, where) {
|
|
298
305
|
if (!where)
|
|
299
306
|
return {};
|
|
300
|
-
return
|
|
307
|
+
return Filter.fromEntityFilter(entityDefs, where).toJson();
|
|
301
308
|
}
|
|
302
309
|
export function buildFilterFromRequestParameters(entity, filterInfo) {
|
|
303
310
|
let where = [];
|
|
304
|
-
[...entity.fields].forEach(col => {
|
|
311
|
+
[...entity.fields].forEach((col) => {
|
|
305
312
|
function addFilter(operation, theFilter, jsonArray = false, asString = false) {
|
|
306
313
|
let val = filterInfo.get(col.key + operation);
|
|
307
314
|
if (val !== undefined) {
|
|
@@ -313,7 +320,7 @@ export function buildFilterFromRequestParameters(entity, filterInfo) {
|
|
|
313
320
|
arr = JSON.parse(val);
|
|
314
321
|
else
|
|
315
322
|
arr = val;
|
|
316
|
-
theVal = arr.map(x => asString ? x : col.valueConverter.fromJson(x));
|
|
323
|
+
theVal = arr.map((x) => asString ? x : col.valueConverter.fromJson(x));
|
|
317
324
|
}
|
|
318
325
|
else {
|
|
319
326
|
theVal = asString ? theVal : col.valueConverter.fromJson(theVal);
|
|
@@ -324,7 +331,7 @@ export function buildFilterFromRequestParameters(entity, filterInfo) {
|
|
|
324
331
|
}
|
|
325
332
|
};
|
|
326
333
|
if (!jsonArray && val instanceof Array) {
|
|
327
|
-
val.forEach(v => {
|
|
334
|
+
val.forEach((v) => {
|
|
328
335
|
addFilter(v);
|
|
329
336
|
});
|
|
330
337
|
}
|
|
@@ -341,44 +348,57 @@ export function buildFilterFromRequestParameters(entity, filterInfo) {
|
|
|
341
348
|
}
|
|
342
349
|
}
|
|
343
350
|
let c = new filterHelper(col);
|
|
344
|
-
addFilter('', val => val);
|
|
345
|
-
addFilter('.gt', val => ({
|
|
346
|
-
addFilter('.gte', val => ({
|
|
347
|
-
addFilter('.lt', val => ({
|
|
348
|
-
addFilter('.lte', val => ({
|
|
349
|
-
addFilter('.ne', val => ({
|
|
350
|
-
addFilter('.in', val => val, true);
|
|
351
|
-
var nullFilter = filterInfo.get(col.key +
|
|
351
|
+
addFilter('', (val) => val);
|
|
352
|
+
addFilter('.gt', (val) => ({ $gt: val }));
|
|
353
|
+
addFilter('.gte', (val) => ({ $gte: val }));
|
|
354
|
+
addFilter('.lt', (val) => ({ $lt: val }));
|
|
355
|
+
addFilter('.lte', (val) => ({ $lte: val }));
|
|
356
|
+
addFilter('.ne', (val) => ({ $ne: val }));
|
|
357
|
+
addFilter('.in', (val) => val, true);
|
|
358
|
+
var nullFilter = filterInfo.get(col.key + '.null');
|
|
352
359
|
if (nullFilter) {
|
|
353
360
|
nullFilter = nullFilter.toString().trim().toLowerCase();
|
|
354
361
|
switch (nullFilter) {
|
|
355
|
-
case
|
|
356
|
-
case
|
|
357
|
-
case
|
|
362
|
+
case 'y':
|
|
363
|
+
case 'true':
|
|
364
|
+
case 'yes':
|
|
358
365
|
where.push({ [col.key]: null });
|
|
359
366
|
break;
|
|
360
367
|
default:
|
|
361
|
-
where.push({ [col.key]: {
|
|
368
|
+
where.push({ [col.key]: { $ne: null } });
|
|
362
369
|
break;
|
|
363
370
|
}
|
|
364
371
|
}
|
|
365
|
-
addFilter('.contains', val => ({ $contains: val }), false, true);
|
|
372
|
+
addFilter('.contains', (val) => ({ $contains: val }), false, true);
|
|
366
373
|
});
|
|
367
374
|
let val = filterInfo.get('OR');
|
|
368
375
|
if (val) {
|
|
369
376
|
const array = separateArrayFromInnerArray(val);
|
|
370
377
|
where.push({
|
|
371
|
-
$and: array.map(v => ({
|
|
372
|
-
$or: v.map(x => buildFilterFromRequestParameters(entity, {
|
|
373
|
-
|
|
378
|
+
$and: array.map((v) => ({
|
|
379
|
+
$or: v.map((x) => buildFilterFromRequestParameters(entity, {
|
|
380
|
+
get: (key) => x[key],
|
|
381
|
+
})),
|
|
382
|
+
})),
|
|
374
383
|
});
|
|
375
384
|
}
|
|
376
385
|
for (const key in entity.entityType) {
|
|
377
386
|
const element = entity.entityType[key];
|
|
378
|
-
if (element &&
|
|
387
|
+
if (element &&
|
|
388
|
+
element.rawFilterInfo &&
|
|
389
|
+
element.rawFilterInfo.rawFilterTranslator) {
|
|
379
390
|
let custom = filterInfo.get(customUrlToken + key);
|
|
380
391
|
if (custom !== undefined) {
|
|
381
|
-
|
|
392
|
+
const addItem = (item) => {
|
|
393
|
+
if (item[customArrayToken] != undefined)
|
|
394
|
+
item = item[customArrayToken];
|
|
395
|
+
where.push({ [customUrlToken + key]: item });
|
|
396
|
+
};
|
|
397
|
+
if (Array.isArray(custom)) {
|
|
398
|
+
custom.forEach((item) => addItem(item));
|
|
399
|
+
}
|
|
400
|
+
else
|
|
401
|
+
addItem(custom);
|
|
382
402
|
}
|
|
383
403
|
}
|
|
384
404
|
}
|
|
@@ -405,7 +425,7 @@ class customTranslator {
|
|
|
405
425
|
this.promises = [];
|
|
406
426
|
}
|
|
407
427
|
applyTo(x) {
|
|
408
|
-
this.commands.forEach(y => y(x));
|
|
428
|
+
this.commands.forEach((y) => y(x));
|
|
409
429
|
}
|
|
410
430
|
or(orElements) {
|
|
411
431
|
let newOrElements;
|
|
@@ -413,54 +433,54 @@ class customTranslator {
|
|
|
413
433
|
let c = new customTranslator(this.translateCustom);
|
|
414
434
|
element.__applyToConsumer(c);
|
|
415
435
|
await c.resolve();
|
|
416
|
-
return new Filter(x => c.applyTo(x));
|
|
417
|
-
})).then(x => {
|
|
436
|
+
return new Filter((x) => c.applyTo(x));
|
|
437
|
+
})).then((x) => {
|
|
418
438
|
newOrElements = x;
|
|
419
439
|
}));
|
|
420
|
-
this.commands.push(x => x.or(newOrElements));
|
|
440
|
+
this.commands.push((x) => x.or(newOrElements));
|
|
421
441
|
}
|
|
422
442
|
isEqualTo(col, val) {
|
|
423
|
-
this.commands.push(x => x.isEqualTo(col, val));
|
|
443
|
+
this.commands.push((x) => x.isEqualTo(col, val));
|
|
424
444
|
}
|
|
425
445
|
isDifferentFrom(col, val) {
|
|
426
|
-
this.commands.push(x => x.isDifferentFrom(col, val));
|
|
446
|
+
this.commands.push((x) => x.isDifferentFrom(col, val));
|
|
427
447
|
}
|
|
428
448
|
isNull(col) {
|
|
429
|
-
this.commands.push(x => x.isNull(col));
|
|
449
|
+
this.commands.push((x) => x.isNull(col));
|
|
430
450
|
}
|
|
431
451
|
isNotNull(col) {
|
|
432
|
-
this.commands.push(x => x.isNotNull(col));
|
|
452
|
+
this.commands.push((x) => x.isNotNull(col));
|
|
433
453
|
}
|
|
434
454
|
isGreaterOrEqualTo(col, val) {
|
|
435
|
-
this.commands.push(x => x.isGreaterOrEqualTo(col, val));
|
|
455
|
+
this.commands.push((x) => x.isGreaterOrEqualTo(col, val));
|
|
436
456
|
}
|
|
437
457
|
isGreaterThan(col, val) {
|
|
438
|
-
this.commands.push(x => x.isGreaterThan(col, val));
|
|
458
|
+
this.commands.push((x) => x.isGreaterThan(col, val));
|
|
439
459
|
}
|
|
440
460
|
isLessOrEqualTo(col, val) {
|
|
441
|
-
this.commands.push(x => x.isLessOrEqualTo(col, val));
|
|
461
|
+
this.commands.push((x) => x.isLessOrEqualTo(col, val));
|
|
442
462
|
}
|
|
443
463
|
isLessThan(col, val) {
|
|
444
|
-
this.commands.push(x => x.isLessThan(col, val));
|
|
464
|
+
this.commands.push((x) => x.isLessThan(col, val));
|
|
445
465
|
}
|
|
446
466
|
containsCaseInsensitive(col, val) {
|
|
447
|
-
this.commands.push(x => x.containsCaseInsensitive(col, val));
|
|
467
|
+
this.commands.push((x) => x.containsCaseInsensitive(col, val));
|
|
448
468
|
}
|
|
449
469
|
isIn(col, val) {
|
|
450
|
-
this.commands.push(x => x.isIn(col, val));
|
|
470
|
+
this.commands.push((x) => x.isIn(col, val));
|
|
451
471
|
}
|
|
452
472
|
custom(key, customItem) {
|
|
453
473
|
this.promises.push((async () => {
|
|
454
474
|
let r = await this.translateCustom(key, customItem);
|
|
455
475
|
if (r)
|
|
456
476
|
if (Array.isArray(r))
|
|
457
|
-
r.forEach(x => x.__applyToConsumer(this));
|
|
477
|
+
r.forEach((x) => x.__applyToConsumer(this));
|
|
458
478
|
else
|
|
459
479
|
r.__applyToConsumer(this);
|
|
460
480
|
})());
|
|
461
481
|
}
|
|
462
482
|
databaseCustom(custom) {
|
|
463
|
-
this.commands.push(x => x.databaseCustom(custom));
|
|
483
|
+
this.commands.push((x) => x.databaseCustom(custom));
|
|
464
484
|
}
|
|
465
485
|
async resolve() {
|
|
466
486
|
while (this.promises.length > 0) {
|