@sap/cds 5.9.8 → 6.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +277 -20
- package/apis/services.d.ts +1 -1
- package/app/fiori/preview.js +2 -6
- package/app/index.js +3 -3
- package/bin/build/buildTaskEngine.js +17 -15
- package/bin/build/buildTaskFactory.js +29 -19
- package/bin/build/buildTaskHandler.js +27 -11
- package/bin/build/buildTaskProvider.js +2 -4
- package/bin/build/buildTaskProviderFactory.js +11 -16
- package/bin/build/constants.js +14 -6
- package/bin/build/csv-reader.js +2 -1
- package/bin/build/index.js +12 -18
- package/bin/build/provider/buildTaskHandlerEdmx.js +3 -39
- package/bin/build/provider/buildTaskHandlerFeatureToggles.js +149 -0
- package/bin/build/provider/buildTaskHandlerInternal.js +2 -3
- package/bin/build/provider/buildTaskProviderInternal.js +108 -239
- package/bin/build/provider/fiori/index.js +2 -2
- package/bin/build/provider/hana/2migration.js +11 -11
- package/bin/build/provider/hana/2tabledata.js +3 -3
- package/bin/build/provider/hana/index.js +89 -99
- package/bin/build/provider/hana/migrationtable.js +4 -3
- package/bin/build/provider/java/index.js +101 -0
- package/bin/build/provider/java-cf/index.js +1 -101
- package/bin/build/provider/mtx/index.js +83 -41
- package/bin/build/provider/mtx/resourcesTarBuilder.js +68 -0
- package/bin/build/provider/mtx-sidecar/index.js +110 -0
- package/bin/build/provider/node-cf/index.js +1 -308
- package/bin/build/provider/nodejs/index.js +189 -0
- package/bin/build/util.js +21 -31
- package/bin/cds.js +5 -3
- package/bin/deploy/to-hana/cfUtil.js +31 -6
- package/bin/deploy/to-hana/gitUtil.js +5 -3
- package/bin/deploy/to-hana/hana.js +15 -13
- package/bin/{build → deploy/to-hana}/mtaUtil.js +10 -9
- package/bin/mtx/in-cds.js +19 -7
- package/bin/serve.js +49 -22
- package/bin/utils/log.js +13 -30
- package/bin/version.js +4 -3
- package/common.cds +61 -16
- package/lib/compile/cdsc.js +3 -2
- package/lib/compile/etc/_localized.js +15 -14
- package/lib/compile/for/drafts.js +3 -4
- package/lib/compile/for/java.js +13 -10
- package/lib/compile/for/nodejs.js +8 -8
- package/lib/compile/for/odata.js +7 -12
- package/lib/compile/for/sql.js +5 -6
- package/lib/compile/index.js +5 -4
- package/lib/compile/load.js +9 -11
- package/lib/compile/minify.js +8 -5
- package/lib/compile/parse.js +4 -2
- package/lib/compile/resolve.js +18 -15
- package/lib/compile/to/edm.js +0 -1
- package/lib/compile/to/gql.js +3 -2
- package/lib/compile/to/json.js +24 -17
- package/lib/connect/bindings.js +3 -2
- package/lib/connect/index.js +5 -5
- package/lib/core/classes.js +74 -2
- package/lib/core/entities.js +52 -3
- package/lib/core/reflect.js +2 -1
- package/lib/deploy.js +10 -8
- package/lib/env/defaults.js +4 -3
- package/lib/env/index.js +71 -31
- package/lib/env/presets.js +1 -14
- package/lib/env/requires.js +71 -20
- package/lib/env/serviceBindings.js +147 -0
- package/lib/i18n/localize.js +22 -23
- package/lib/index.js +148 -144
- package/lib/log/errors.js +55 -12
- package/lib/log/format/kibana.js +1 -1
- package/lib/log/index.js +4 -0
- package/lib/ql/SELECT.js +7 -2
- package/lib/ql/Whereable.js +8 -2
- package/lib/ql/index.js +2 -2
- package/lib/req/assert.js +71 -0
- package/lib/req/cds-context.js +38 -70
- package/lib/req/context.js +34 -21
- package/lib/req/request.js +12 -18
- package/lib/req/response.js +6 -2
- package/lib/req/user.js +30 -22
- package/lib/serve/Service-api.js +17 -12
- package/lib/serve/Service-dispatch.js +5 -9
- package/lib/serve/Service-methods.js +4 -3
- package/lib/serve/Transaction.js +24 -21
- package/lib/serve/adapters.js +15 -5
- package/lib/serve/factory.js +22 -20
- package/lib/serve/index.js +51 -54
- package/lib/utils/axios.js +8 -12
- package/lib/utils/index.js +13 -4
- package/lib/utils/resources/index.js +1 -44
- package/lib/utils/resources/tar.js +2 -1
- package/lib/utils/tests.js +13 -15
- package/libx/_runtime/.eslintrc +1 -1
- package/libx/_runtime/audit/Service.js +6 -4
- package/libx/_runtime/audit/generic/personal/access.js +19 -43
- package/libx/_runtime/audit/generic/personal/index.js +40 -34
- package/libx/_runtime/audit/generic/personal/modification.js +11 -9
- package/libx/_runtime/audit/generic/personal/utils.js +13 -6
- package/libx/_runtime/audit/utils/v2.js +6 -3
- package/libx/_runtime/auth/index.js +71 -66
- package/libx/_runtime/auth/strategies/JWT.js +3 -2
- package/libx/_runtime/auth/strategies/mock.js +54 -53
- package/libx/_runtime/auth/strategies/xssecUtils.js +3 -4
- package/libx/_runtime/auth/strategies/xsuaa.js +3 -2
- package/libx/_runtime/auth/utils.js +2 -15
- package/libx/_runtime/cds-services/adapter/odata-v4/Dispatcher.js +127 -41
- package/libx/_runtime/cds-services/adapter/odata-v4/OData.js +9 -5
- package/libx/_runtime/cds-services/adapter/odata-v4/ODataRequest.js +93 -73
- package/libx/_runtime/cds-services/adapter/odata-v4/handlers/action.js +25 -45
- package/libx/_runtime/cds-services/adapter/odata-v4/handlers/create.js +10 -14
- package/libx/_runtime/cds-services/adapter/odata-v4/handlers/error.js +9 -5
- package/libx/_runtime/cds-services/adapter/odata-v4/handlers/metadata.js +4 -2
- package/libx/_runtime/cds-services/adapter/odata-v4/handlers/read.js +60 -53
- package/libx/_runtime/cds-services/adapter/odata-v4/handlers/request.js +2 -2
- package/libx/_runtime/cds-services/adapter/odata-v4/handlers/update.js +21 -26
- package/libx/_runtime/cds-services/adapter/odata-v4/odata-to-cqn/ExpressionToCQN.js +8 -15
- package/libx/_runtime/cds-services/adapter/odata-v4/odata-to-cqn/expandToCQN.js +29 -41
- package/libx/_runtime/cds-services/adapter/odata-v4/odata-to-cqn/index.js +1 -4
- package/libx/_runtime/cds-services/adapter/odata-v4/odata-to-cqn/readToCQN.js +13 -13
- package/libx/_runtime/cds-services/adapter/odata-v4/odata-to-cqn/selectToCQN.js +0 -7
- package/libx/_runtime/cds-services/adapter/odata-v4/odata-to-cqn/utils.js +24 -1
- package/libx/_runtime/cds-services/adapter/odata-v4/okra/odata-commons/edm/EdmEntityContainer.js +1 -1
- package/libx/_runtime/cds-services/adapter/odata-v4/okra/odata-commons/uri/UriHelper.js +4 -3
- package/libx/_runtime/cds-services/adapter/odata-v4/okra/odata-commons/utils/PrimitiveValueDecoder.js +4 -5
- package/libx/_runtime/cds-services/adapter/odata-v4/okra/odata-commons/utils/ValueConverter.js +4 -3
- package/libx/_runtime/cds-services/adapter/odata-v4/okra/odata-commons/validator/ValueValidator.js +5 -3
- package/libx/_runtime/cds-services/adapter/odata-v4/okra/odata-server/core/ResponseHeaderSetter.js +2 -0
- package/libx/_runtime/cds-services/adapter/odata-v4/okra/odata-server/invocation/DebugSerializingCommand.js +1 -1
- package/libx/_runtime/cds-services/adapter/odata-v4/okra/odata-server/invocation/PresetResponseHeadersCommand.js +1 -1
- package/libx/_runtime/cds-services/adapter/odata-v4/okra/odata-server/invocation/SerializingCommand.js +1 -1
- package/libx/_runtime/cds-services/adapter/odata-v4/okra/odata-server/invocation/SetResponseHeadersCommand.js +1 -1
- package/libx/_runtime/cds-services/adapter/odata-v4/okra/odata-server/serializer/ContextURLFactory.js +3 -2
- package/libx/_runtime/cds-services/adapter/odata-v4/okra/odata-server/serializer/ErrorJsonSerializer.js +3 -1
- package/libx/_runtime/cds-services/adapter/odata-v4/okra/odata-server/serializer/SerializerFactory.js +1 -0
- package/libx/_runtime/cds-services/adapter/odata-v4/okra/odata-server/serializer/TrustedResourceJsonSerializer.js +3 -3
- package/libx/_runtime/cds-services/adapter/odata-v4/utils/data.js +36 -25
- package/libx/_runtime/cds-services/adapter/odata-v4/utils/handlerUtils.js +97 -92
- package/libx/_runtime/cds-services/adapter/odata-v4/utils/metaInfo.js +382 -0
- package/libx/_runtime/cds-services/adapter/odata-v4/utils/oDataConfiguration.js +1 -4
- package/libx/_runtime/cds-services/adapter/odata-v4/utils/omitValues.js +5 -6
- package/libx/_runtime/cds-services/adapter/odata-v4/utils/readAfterWrite.js +82 -21
- package/libx/_runtime/cds-services/adapter/odata-v4/utils/request.js +3 -11
- package/libx/_runtime/cds-services/adapter/odata-v4/utils/result.js +91 -69
- package/libx/_runtime/cds-services/adapter/odata-v4/utils/stream.js +27 -6
- package/libx/_runtime/cds-services/adapter/rest/utils/validation-checks.js +7 -17
- package/libx/_runtime/cds-services/services/Service.js +17 -76
- package/libx/_runtime/cds-services/services/utils/columns.js +6 -4
- package/libx/_runtime/cds-services/services/utils/compareJson.js +1 -53
- package/libx/_runtime/cds-services/services/utils/differ.js +15 -19
- package/libx/_runtime/cds-services/util/assert.js +107 -34
- package/libx/_runtime/cds.js +1 -31
- package/libx/_runtime/common/aspects/Association.js +40 -54
- package/libx/_runtime/common/aspects/any.js +61 -6
- package/libx/_runtime/common/aspects/entity.js +19 -79
- package/libx/_runtime/common/composition/data.js +2 -2
- package/libx/_runtime/common/composition/delete.js +8 -7
- package/libx/_runtime/common/composition/tree.js +10 -10
- package/libx/_runtime/common/composition/update.js +3 -2
- package/libx/_runtime/common/constants/events.js +13 -0
- package/libx/_runtime/common/error/entry.js +9 -3
- package/libx/_runtime/common/error/frontend.js +13 -19
- package/libx/_runtime/common/error/index.js +8 -3
- package/libx/_runtime/common/generic/auth/capabilities.js +2 -1
- package/libx/_runtime/common/generic/auth/constants.js +1 -4
- package/libx/_runtime/common/generic/auth/requires.js +1 -1
- package/libx/_runtime/common/generic/auth/restrict.js +12 -28
- package/libx/_runtime/common/generic/auth/restrictions.js +12 -4
- package/libx/_runtime/common/generic/auth/utils.js +2 -1
- package/libx/_runtime/common/generic/crud.js +9 -60
- package/libx/_runtime/common/generic/etag.js +41 -7
- package/libx/_runtime/common/generic/input.js +128 -66
- package/libx/_runtime/common/generic/paging.js +9 -3
- package/libx/_runtime/common/generic/put.js +2 -2
- package/libx/_runtime/common/generic/sorting.js +7 -3
- package/libx/_runtime/common/generic/temporal.js +0 -5
- package/libx/_runtime/common/i18n/messages.properties +2 -1
- package/libx/_runtime/common/utils/binary.js +69 -0
- package/libx/_runtime/common/utils/cqn.js +39 -14
- package/libx/_runtime/common/utils/cqn2cqn4sql.js +93 -59
- package/libx/_runtime/common/utils/csn.js +87 -85
- package/libx/_runtime/common/utils/dollar.js +8 -7
- package/libx/_runtime/common/utils/draft.js +1 -1
- package/libx/_runtime/common/utils/foreignKeyPropagations.js +23 -7
- package/libx/_runtime/common/utils/generateOnCond.js +2 -1
- package/libx/_runtime/common/utils/keys.js +30 -13
- package/libx/_runtime/common/utils/postProcessing.js +6 -1
- package/libx/_runtime/common/utils/quotingStyles.js +0 -23
- package/libx/_runtime/common/utils/resolveStructured.js +23 -26
- package/libx/_runtime/common/utils/resolveView.js +4 -1
- package/libx/_runtime/common/utils/rewriteAsterisks.js +3 -0
- package/libx/_runtime/common/utils/search2cqn4sql.js +4 -13
- package/libx/_runtime/common/utils/searchToLike.js +9 -13
- package/libx/_runtime/common/utils/streamProp.js +35 -0
- package/libx/_runtime/common/utils/structured.js +12 -18
- package/libx/_runtime/common/utils/template.js +3 -5
- package/libx/_runtime/common/utils/templateProcessor.js +22 -14
- package/libx/_runtime/common/utils/unionCqnTemplate.js +4 -14
- package/libx/_runtime/db/Service.js +2 -1
- package/libx/_runtime/db/expand/expand-v2.js +2 -2
- package/libx/_runtime/db/expand/expandCQNToJoin.js +7 -6
- package/libx/_runtime/db/generic/input.js +14 -17
- package/libx/_runtime/db/generic/integrity.js +1 -2
- package/libx/_runtime/db/generic/update.js +14 -1
- package/libx/_runtime/db/query/read.js +0 -1
- package/libx/_runtime/db/query/update.js +1 -1
- package/libx/_runtime/db/sql-builder/BaseBuilder.js +1 -1
- package/libx/_runtime/db/sql-builder/ExpressionBuilder.js +5 -31
- package/libx/_runtime/db/sql-builder/InsertBuilder.js +1 -1
- package/libx/_runtime/db/sql-builder/ReferenceBuilder.js +0 -9
- package/libx/_runtime/db/sql-builder/SelectBuilder.js +11 -10
- package/libx/_runtime/db/sql-builder/UpdateBuilder.js +2 -2
- package/libx/_runtime/db/sql-builder/annotations.js +1 -2
- package/libx/_runtime/db/utils/coloredTxCommands.js +5 -0
- package/libx/_runtime/db/utils/columns.js +1 -1
- package/libx/_runtime/db/utils/propagateForeignKeys.js +10 -2
- package/libx/_runtime/extensibility/activate.js +69 -0
- package/libx/_runtime/extensibility/add.js +41 -0
- package/libx/_runtime/extensibility/addExtension.js +68 -0
- package/libx/_runtime/extensibility/defaults.js +39 -0
- package/libx/_runtime/extensibility/{uiflex/handler → handler}/transformREAD.js +0 -0
- package/libx/_runtime/extensibility/{uiflex/handler → handler}/transformRESULT.js +2 -2
- package/libx/_runtime/extensibility/{uiflex/handler → handler}/transformWRITE.js +2 -2
- package/libx/_runtime/extensibility/push.js +61 -0
- package/libx/_runtime/extensibility/service.js +21 -0
- package/libx/_runtime/extensibility/{uiflex/utils.js → utils.js} +39 -3
- package/libx/_runtime/extensibility/validation.js +53 -0
- package/libx/_runtime/extensibility/views.js +12 -0
- package/libx/_runtime/fiori/generic/activate.js +2 -4
- package/libx/_runtime/fiori/generic/before.js +17 -29
- package/libx/_runtime/fiori/generic/cancel.js +2 -4
- package/libx/_runtime/fiori/generic/delete.js +2 -4
- package/libx/_runtime/fiori/generic/edit.js +4 -16
- package/libx/_runtime/fiori/generic/index.js +31 -0
- package/libx/_runtime/fiori/generic/new.js +5 -21
- package/libx/_runtime/fiori/generic/patch.js +10 -15
- package/libx/_runtime/fiori/generic/prepare.js +13 -22
- package/libx/_runtime/fiori/generic/read.js +148 -163
- package/libx/_runtime/fiori/generic/readOverDraft.js +10 -4
- package/libx/_runtime/fiori/utils/handler.js +10 -22
- package/libx/_runtime/fiori/utils/where.js +1 -4
- package/libx/_runtime/hana/Service.js +14 -7
- package/libx/_runtime/hana/customBuilder/CustomSelectBuilder.js +1 -1
- package/libx/_runtime/hana/dynatrace.js +2 -2
- package/libx/_runtime/hana/localized.js +7 -6
- package/libx/_runtime/hana/pool.js +9 -6
- package/libx/_runtime/hana/search.js +2 -3
- package/libx/_runtime/hana/{searchToContains.js → search2Contains.js} +5 -2
- package/libx/_runtime/hana/search2cqn4sql.js +20 -17
- package/libx/_runtime/index.js +2 -6
- package/libx/_runtime/messaging/AMQPWebhookMessaging.js +30 -22
- package/libx/_runtime/messaging/common-utils/AMQPClient.js +4 -3
- package/libx/_runtime/messaging/common-utils/appId.js +9 -0
- package/libx/_runtime/messaging/common-utils/authorizedRequest.js +2 -18
- package/libx/_runtime/messaging/common-utils/connections.js +1 -1
- package/libx/_runtime/messaging/enterprise-messaging-shared.js +2 -2
- package/libx/_runtime/messaging/enterprise-messaging-utils/EMManagement.js +305 -231
- package/libx/_runtime/messaging/enterprise-messaging-utils/cloudEvents.js +2 -2
- package/libx/_runtime/messaging/enterprise-messaging-utils/options-management.js +15 -8
- package/libx/_runtime/messaging/enterprise-messaging-utils/options-messaging.js +57 -14
- package/libx/_runtime/messaging/enterprise-messaging.js +14 -19
- package/libx/_runtime/messaging/file-based.js +3 -1
- package/libx/_runtime/messaging/http-utils/token.js +18 -6
- package/libx/_runtime/messaging/message-queuing-utils/options-management.js +22 -12
- package/libx/_runtime/messaging/message-queuing-utils/options-messaging.js +27 -14
- package/libx/_runtime/messaging/message-queuing.js +138 -85
- package/libx/_runtime/messaging/outbox/utils.js +13 -7
- package/libx/_runtime/messaging/redis-messaging.js +0 -1
- package/libx/_runtime/messaging/service.js +4 -1
- package/libx/_runtime/remote/Service.js +24 -18
- package/libx/_runtime/remote/utils/client.js +90 -48
- package/libx/_runtime/remote/utils/data.js +23 -6
- package/libx/_runtime/sqlite/Service.js +14 -13
- package/libx/_runtime/sqlite/convertAssocToOneManaged.js +2 -0
- package/libx/_runtime/sqlite/customBuilder/CustomSelectBuilder.js +1 -0
- package/libx/_runtime/sqlite/execute.js +3 -9
- package/libx/_runtime/types/api.js +23 -11
- package/libx/common/utils/ucsn.js +15 -9
- package/libx/odata/afterburner.js +109 -29
- package/libx/odata/cqn2odata.js +48 -9
- package/libx/odata/grammar.pegjs +263 -156
- package/libx/odata/index.js +21 -9
- package/libx/odata/parseToCqn.js +8 -5
- package/libx/odata/parser.js +1 -1
- package/libx/odata/utils.js +13 -3
- package/libx/rest/RestAdapter.js +173 -113
- package/libx/rest/RestRequest.js +3 -2
- package/libx/rest/middleware/create.js +8 -6
- package/libx/rest/middleware/delete.js +6 -13
- package/libx/rest/middleware/error.js +1 -1
- package/libx/rest/middleware/input.js +6 -6
- package/libx/rest/middleware/operation.js +8 -3
- package/libx/rest/middleware/parse.js +3 -3
- package/libx/rest/middleware/payload.js +12 -0
- package/libx/rest/middleware/read.js +12 -2
- package/libx/rest/middleware/update.js +3 -3
- package/package.json +4 -6
- package/server.js +3 -44
- package/srv/extensibility-service.cds +56 -0
- package/srv/extensibility-service.js +1 -0
- package/srv/extensions.cds +8 -0
- package/srv/model-provider.cds +59 -0
- package/srv/model-provider.js +163 -0
- package/srv/mtx.cds +2 -0
- package/srv/mtx.js +22 -0
- package/srv/outbox.cds +2 -0
- package/tasks/enterprise-messaging-deploy.js +19 -12
- package/lib/serve/Service-compat.js +0 -36
- package/libx/_runtime/audit/generic/personal/constants.js +0 -4
- package/libx/_runtime/auth/strategies/dwc.js +0 -45
- package/libx/_runtime/cds-services/adapter/odata-v4/utils/dispatcherUtils.js +0 -56
- package/libx/_runtime/cds-services/adapter/rest/Rest.js +0 -183
- package/libx/_runtime/cds-services/adapter/rest/RestRequest.js +0 -67
- package/libx/_runtime/cds-services/adapter/rest/handlers/create.js +0 -82
- package/libx/_runtime/cds-services/adapter/rest/handlers/delete.js +0 -39
- package/libx/_runtime/cds-services/adapter/rest/handlers/operation.js +0 -63
- package/libx/_runtime/cds-services/adapter/rest/handlers/read.js +0 -52
- package/libx/_runtime/cds-services/adapter/rest/handlers/update.js +0 -81
- package/libx/_runtime/cds-services/adapter/rest/rest-to-cqn/index.js +0 -56
- package/libx/_runtime/cds-services/adapter/rest/rest-to-cqn/utils.js +0 -33
- package/libx/_runtime/cds-services/adapter/rest/to.js +0 -8
- package/libx/_runtime/cds-services/adapter/rest/utils/binary.js +0 -50
- package/libx/_runtime/cds-services/adapter/rest/utils/data.js +0 -117
- package/libx/_runtime/cds-services/adapter/rest/utils/header-checks.js +0 -14
- package/libx/_runtime/cds-services/adapter/rest/utils/key-value-utils.js +0 -30
- package/libx/_runtime/cds-services/adapter/rest/utils/parse-url.js +0 -250
- package/libx/_runtime/cds-services/adapter/rest/utils/result.js +0 -26
- package/libx/_runtime/cds-services/services/utils/handlerUtils.js +0 -200
- package/libx/_runtime/common/aspects/utils.js +0 -152
- package/libx/_runtime/common/toggles/handler.js +0 -21
- package/libx/_runtime/common/utils/extensibilityUtils.js +0 -18
- package/libx/_runtime/extensibility/mps/index.js +0 -5
- package/libx/_runtime/extensibility/mps/service.js +0 -111
- package/libx/_runtime/extensibility/mps/tar.js +0 -42
- package/libx/_runtime/extensibility/mps/utils.js +0 -11
- package/libx/_runtime/extensibility/uiflex/index.js +0 -54
- package/libx/_runtime/extensibility/uiflex/service.js +0 -276
- package/libx/_runtime/messaging/common-utils/naming-conventions.js +0 -20
- package/libx/_runtime/remote/utils/client-types.d.ts +0 -7
- package/libx/gql/GraphQLAdapter.js +0 -33
- package/libx/gql/constants/adapter.js +0 -69
- package/libx/gql/constants/cds.js +0 -18
- package/libx/gql/constants/graphql.js +0 -33
- package/libx/gql/readme.md +0 -1
- package/libx/gql/resolvers/crud/create.js +0 -20
- package/libx/gql/resolvers/crud/delete.js +0 -29
- package/libx/gql/resolvers/crud/index.js +0 -6
- package/libx/gql/resolvers/crud/read.js +0 -30
- package/libx/gql/resolvers/crud/update.js +0 -42
- package/libx/gql/resolvers/crud/utils/index.js +0 -36
- package/libx/gql/resolvers/field.js +0 -5
- package/libx/gql/resolvers/index.js +0 -7
- package/libx/gql/resolvers/mutation.js +0 -23
- package/libx/gql/resolvers/parse/ast/enrich.js +0 -52
- package/libx/gql/resolvers/parse/ast/fragment.js +0 -11
- package/libx/gql/resolvers/parse/ast/fromObject.js +0 -39
- package/libx/gql/resolvers/parse/ast/index.js +0 -3
- package/libx/gql/resolvers/parse/ast/meta.js +0 -4
- package/libx/gql/resolvers/parse/ast/variable.js +0 -7
- package/libx/gql/resolvers/parse/ast2cqn/columns.js +0 -44
- package/libx/gql/resolvers/parse/ast2cqn/entries.js +0 -31
- package/libx/gql/resolvers/parse/ast2cqn/index.js +0 -8
- package/libx/gql/resolvers/parse/ast2cqn/limit.js +0 -6
- package/libx/gql/resolvers/parse/ast2cqn/orderBy.js +0 -24
- package/libx/gql/resolvers/parse/ast2cqn/utils/index.js +0 -3
- package/libx/gql/resolvers/parse/ast2cqn/where.js +0 -70
- package/libx/gql/resolvers/parse/utils/index.js +0 -8
- package/libx/gql/resolvers/query.js +0 -13
- package/libx/gql/resolvers/root.js +0 -34
- package/libx/gql/schema/generate.js +0 -18
- package/libx/gql/schema/index.js +0 -5
- package/libx/gql/schema/mutation.js +0 -76
- package/libx/gql/schema/query.js +0 -108
- package/libx/gql/schema/typeDefMap.js +0 -45
- package/libx/gql/schema/utils/index.js +0 -54
- package/libx/gql/utils/index.js +0 -12
- package/libx/rest/middleware/auth.js +0 -20
- package/libx/rest/middleware/content.js +0 -19
- package/srv/flex.cds +0 -21
- package/srv/flex.js +0 -1
- package/srv/mps.cds +0 -23
- package/srv/mps.js +0 -1
- package/srv/outbox.js +0 -0
package/lib/i18n/localize.js
CHANGED
|
@@ -2,12 +2,7 @@ const cds = require ('..')
|
|
|
2
2
|
const {existsSync, readdirSync} = require ('fs')
|
|
3
3
|
const {join,dirname,resolve,parse} = require ('path')
|
|
4
4
|
|
|
5
|
-
const DEBUG =
|
|
6
|
-
const conf = cds.env && cds.env.i18n || {}
|
|
7
|
-
const DefaultLanguage = conf.default_language || 'en'
|
|
8
|
-
const FallbackBundle = conf.fallback_bundle || ''
|
|
9
|
-
const I18nFolders = conf.folders || [ '_i18n', 'i18n' ]
|
|
10
|
-
const I18nFile = conf.file || 'i18n'
|
|
5
|
+
const DEBUG = cds.debug('i18n')
|
|
11
6
|
|
|
12
7
|
|
|
13
8
|
module.exports = Object.assign (localize, {
|
|
@@ -38,7 +33,7 @@ function localizeString (aString, bundle) {
|
|
|
38
33
|
if (!bundle || !aString) return aString
|
|
39
34
|
if (typeof aString === 'object') aString = JSON.stringify(aString, null, 2)
|
|
40
35
|
// quick check for presence of any text key, to avoid expensive operation below
|
|
41
|
-
if (aString.
|
|
36
|
+
if (!aString.includes(TEXT_KEY_MARKER)) return aString
|
|
42
37
|
const escape = aString.startsWith('<?xml') ? escapeXmlAttr : /^[{[]/.test(aString) ? escapeJson : v=>v
|
|
43
38
|
return aString.replace (TEXT_KEYS, (_, key) => {
|
|
44
39
|
const val = bundle[key]
|
|
@@ -62,7 +57,7 @@ function bundles4 (model, locales) { // NOSONAR
|
|
|
62
57
|
if (locales.length === 1 && (locales[0] === '*' || locales[0] === 'all')) {
|
|
63
58
|
locales = allLocales4 (folders)
|
|
64
59
|
if (!locales) return {}
|
|
65
|
-
if (!locales.includes(
|
|
60
|
+
if (!locales.includes(cds.env.i18n.fallback_bundle)) locales.push (cds.env.i18n.fallback_bundle)
|
|
66
61
|
}
|
|
67
62
|
DEBUG && DEBUG ('Languages:', locales)
|
|
68
63
|
|
|
@@ -70,7 +65,7 @@ function bundles4 (model, locales) { // NOSONAR
|
|
|
70
65
|
for (let each of locales) {
|
|
71
66
|
let bundle = bundle4 (model, each)
|
|
72
67
|
if (bundle) {
|
|
73
|
-
DEBUG && DEBUG (bundle
|
|
68
|
+
DEBUG && DEBUG (bundle)
|
|
74
69
|
yield [ each, bundle ]
|
|
75
70
|
}
|
|
76
71
|
}
|
|
@@ -85,14 +80,16 @@ function bundles4 (model, locales) { // NOSONAR
|
|
|
85
80
|
function allLocales4 (folders) {
|
|
86
81
|
// find all languages in all folders
|
|
87
82
|
const files = folders
|
|
88
|
-
.map (folder => readdirSync(folder)
|
|
89
|
-
|
|
83
|
+
.map (folder => readdirSync(folder)
|
|
84
|
+
.filter (e => e.startsWith(cds.env.i18n.file))
|
|
85
|
+
.map(i18nFile => join (folder, i18nFile))
|
|
86
|
+
).reduce ((files, file) => files.concat(file)) // flatten
|
|
90
87
|
if (files.length === 0) {
|
|
91
88
|
DEBUG && DEBUG ('No languages for folders:', folders)
|
|
92
89
|
return null
|
|
93
90
|
}
|
|
94
91
|
|
|
95
|
-
|
|
92
|
+
if (files[0].endsWith('.csv')) {
|
|
96
93
|
return cds.load.csv (files[0])[0].slice(1)
|
|
97
94
|
} else {
|
|
98
95
|
const locales = new Set()
|
|
@@ -100,8 +97,10 @@ function allLocales4 (folders) {
|
|
|
100
97
|
const parsed = parse(file)
|
|
101
98
|
if (parsed.ext === '.json') {
|
|
102
99
|
Object.keys(require(file)).forEach(locale => locales.add(locale))
|
|
103
|
-
}
|
|
104
|
-
|
|
100
|
+
}
|
|
101
|
+
else if (parsed.ext === '.properties') {
|
|
102
|
+
const match = /_(\w+)$/.exec(parsed.name)
|
|
103
|
+
if (match) locales.add(match[1])
|
|
105
104
|
}
|
|
106
105
|
})
|
|
107
106
|
return Array.from(locales)
|
|
@@ -121,11 +120,11 @@ function bundle4 (model, locale) {
|
|
|
121
120
|
const folders = folders4 (model); if (!folders.length) return //> no folders, hence no bundles found at all
|
|
122
121
|
const bundle = {}
|
|
123
122
|
|
|
124
|
-
add (
|
|
125
|
-
if (locale ===
|
|
123
|
+
add (cds.env.i18n.fallback_bundle) // e.g. i18n.properties
|
|
124
|
+
if (locale === cds.env.i18n.fallback_bundle) return bundle
|
|
126
125
|
|
|
127
|
-
add (
|
|
128
|
-
if (locale ===
|
|
126
|
+
add (cds.env.i18n.default_language) // e.g. i18n_en.properties
|
|
127
|
+
if (locale === cds.env.i18n.default_language) return bundle
|
|
129
128
|
|
|
130
129
|
add (locale) // e.g. i18n_de.properties
|
|
131
130
|
return bundle
|
|
@@ -133,7 +132,7 @@ function bundle4 (model, locale) {
|
|
|
133
132
|
function add (lang) {
|
|
134
133
|
for (let each of folders) {
|
|
135
134
|
const suffix = lang === '' ? '' : '_' + lang
|
|
136
|
-
const file = join (each,
|
|
135
|
+
const file = join (each, cds.env.i18n.file), key = file+suffix
|
|
137
136
|
const next = bundle4[key] || (bundle4[key] = (
|
|
138
137
|
loadFromJSON (file, lang) ||
|
|
139
138
|
cds.load.properties (file + suffix.replace('-','_')) || // e.g. en-UK --> en_UK
|
|
@@ -158,7 +157,7 @@ function folders4 (model) {
|
|
|
158
157
|
if (!model.$sources) return []
|
|
159
158
|
const folders=[]; for (let src of model.$sources) {
|
|
160
159
|
let folder = folder4 (src)
|
|
161
|
-
if (!folder || folders.
|
|
160
|
+
if (!folder || folders.includes(folder)) continue
|
|
162
161
|
folders.push(folder) // use an array here to not screw up the folder order
|
|
163
162
|
}
|
|
164
163
|
|
|
@@ -174,7 +173,7 @@ function folder4 (loc) {
|
|
|
174
173
|
// already cached from a former lookup?
|
|
175
174
|
if (loc in folder4) return folder4[loc]
|
|
176
175
|
// check whether a <loc>/_i18n extists
|
|
177
|
-
for (let i18n of
|
|
176
|
+
for (let i18n of cds.env.i18n.folders) {
|
|
178
177
|
const f = join (loc, i18n)
|
|
179
178
|
if (existsSync(f)) return folder4[loc] = f
|
|
180
179
|
}
|
|
@@ -184,7 +183,7 @@ function folder4 (loc) {
|
|
|
184
183
|
}
|
|
185
184
|
|
|
186
185
|
|
|
187
|
-
function loadFromJSON (res, lang=
|
|
186
|
+
function loadFromJSON (res, lang=cds.env.i18n.default_language) {
|
|
188
187
|
try {
|
|
189
188
|
const bundles = require (resolve (cds.root,res+'.json'))
|
|
190
189
|
return bundles[lang] || bundles [(lang.match(/\w+/)||[])[0]]
|
|
@@ -193,7 +192,7 @@ function loadFromJSON (res, lang=DefaultLanguage) {
|
|
|
193
192
|
}
|
|
194
193
|
}
|
|
195
194
|
|
|
196
|
-
function loadFromCSV (res, lang=
|
|
195
|
+
function loadFromCSV (res, lang=cds.env.i18n.default_language) {
|
|
197
196
|
let csv = cds.load.csv(res+'.csv'); if (!csv) return
|
|
198
197
|
let [header, ...rows] = csv
|
|
199
198
|
if (lang === '*') return header.slice(1).reduce ((all,lang,i) => {
|
package/lib/index.js
CHANGED
|
@@ -1,149 +1,153 @@
|
|
|
1
1
|
/** @typedef {import './serve/Service-api'} Service */
|
|
2
|
-
if (global.cds) Object.assign(module,{exports:global.cds}) ; else {
|
|
3
|
-
|
|
4
|
-
const facade = class cds extends require('events') {
|
|
5
|
-
|
|
6
|
-
get env() { return super.env = require('./env') }
|
|
7
|
-
get requires() { return super.requires = this.env.required_services_or_defs }
|
|
8
|
-
get version() { return super.version = require('../package.json').version }
|
|
9
|
-
get builtin() { return super.builtin = require ('./core') }
|
|
10
|
-
get service() { return super.service = extend (this.builtin.classes.service) .with ({
|
|
11
|
-
/** @param x {(this:Service, srv:Service) => any} */ impl: x=>x,
|
|
12
|
-
/** @type {{ [path:string] : Service }} */ paths: {},
|
|
13
|
-
/** @type Service[] */ providers: [],
|
|
14
|
-
factory: require ('./serve/factory'),
|
|
15
|
-
adapters: require ('./serve/adapters'),
|
|
16
|
-
bindings: require ('./connect/bindings'),
|
|
17
|
-
})}
|
|
18
|
-
/** @type {import './req/context'} */
|
|
19
|
-
get context() { return require('./req/cds-context').for(this) }
|
|
20
|
-
set context(_){ require('./req/cds-context').for(this,_) }
|
|
21
|
-
get spawn() { return super.spawn = require('./req/cds-context').spawn }
|
|
22
|
-
|
|
23
|
-
emit (eve, ...args) {
|
|
24
|
-
if (eve === 'served') return Promise.all (this.listeners(eve).map (l => l.call(this,...args)))
|
|
25
|
-
else return super.emit (eve, ...args)
|
|
26
|
-
}
|
|
27
|
-
}
|
|
28
2
|
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
// Model Reflection
|
|
46
|
-
reflect: require ('./core/reflect'),
|
|
47
|
-
linked: require ('./core/reflect'),
|
|
48
|
-
infer: require ('./core/infer'),
|
|
49
|
-
|
|
50
|
-
// Loading and Compiling Models
|
|
51
|
-
model: undefined,
|
|
52
|
-
compiler: require ('./compile/cdsc'),
|
|
53
|
-
compile: require ('./compile'),
|
|
54
|
-
resolve: require ('./compile/resolve'),
|
|
55
|
-
load: require ('./compile/load'), get: lazy => cds.load.parsed,
|
|
56
|
-
parse: require ('./compile/parse'),
|
|
57
|
-
minify: require ('./compile/minify'),
|
|
58
|
-
extend: require ('./compile/extend'),
|
|
59
|
-
deploy: require ('./deploy'),
|
|
60
|
-
|
|
61
|
-
// Providing and Consuming Services
|
|
62
|
-
services: new class IterableServices {
|
|
63
|
-
*[Symbol.iterator]() {for (let e in this) yield this[e]}
|
|
64
|
-
get _pending(){ return super._pending = {}}
|
|
65
|
-
},
|
|
66
|
-
serve: require ('./serve'),
|
|
67
|
-
server: require ('../server'),
|
|
68
|
-
connect: require ('./connect'),
|
|
69
|
-
|
|
70
|
-
// Core Services API
|
|
71
|
-
Service: require ('./serve/Service-api'),
|
|
72
|
-
EventContext: require ('./req/context'),
|
|
73
|
-
Request: require ('./req/request'),
|
|
74
|
-
Event: require ('./req/event'),
|
|
75
|
-
User: require ('./req/user'),
|
|
76
|
-
ql: require ('./ql'),
|
|
77
|
-
tx: (..._) => (cds.db || cds.Service.prototype) .tx (..._),
|
|
78
|
-
/** @type Service */ db: undefined,
|
|
79
|
-
|
|
80
|
-
// Protocols and Periphery
|
|
81
|
-
ApplicationService: lazy => require('../libx/_runtime/cds-services/services/Service.js'),
|
|
82
|
-
MessagingService: lazy => require('../libx/_runtime/messaging/service.js'),
|
|
83
|
-
DatabaseService: lazy => require('../libx/_runtime/db/Service.js'),
|
|
84
|
-
RemoteService: lazy => require('../libx/_runtime/remote/Service.js'),
|
|
85
|
-
AuditLogService: lazy => require('../libx/_runtime/audit/Service.js'),
|
|
86
|
-
odata: require('../libx/odata'),
|
|
87
|
-
|
|
88
|
-
// Helpers
|
|
89
|
-
localize: require ('./i18n/localize'),
|
|
90
|
-
error: require ('./log/errors'),
|
|
91
|
-
utils: require ('./utils'),
|
|
92
|
-
test: require ('./utils/tests'),
|
|
93
|
-
log: require ('./log'), debug: lazy => cds.log.debug,
|
|
94
|
-
exec: require ('../bin/cds'),
|
|
95
|
-
clone: m => JSON.parse (JSON.stringify(m)),
|
|
96
|
-
lazified, lazify,
|
|
97
|
-
|
|
98
|
-
// Configuration & Information
|
|
99
|
-
home: __dirname.slice(0,-4),
|
|
100
|
-
root: lazy => process.cwd(),
|
|
101
|
-
|
|
102
|
-
})
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
// cds as shortcut to cds.db -> for compatibility only
|
|
106
|
-
extend (cds.__proto__) .with ({
|
|
107
|
-
get entities(){ return (cds.db||_missing).entities },
|
|
108
|
-
transaction: (..._) => (cds.db||_missing).transaction(..._),
|
|
109
|
-
run: (..._) => (cds.db||_missing).run(..._),
|
|
110
|
-
foreach: (..._) => (cds.db||_missing).foreach(..._),
|
|
111
|
-
stream: (..._) => (cds.db||_missing).stream(..._),
|
|
112
|
-
read: (..._) => (cds.db||_missing).read(..._),
|
|
113
|
-
create: (..._) => (cds.db||_missing).create(..._),
|
|
114
|
-
insert: (..._) => (cds.db||_missing).insert(..._),
|
|
115
|
-
update: (..._) => (cds.db||_missing).update(..._),
|
|
116
|
-
delete: (..._) => (cds.db||_missing).delete(..._),
|
|
117
|
-
disconnect: (..._) => (cds.db||_missing).disconnect(..._),
|
|
118
|
-
})
|
|
119
|
-
/** @type Service */ const _missing = new Proxy ({},{
|
|
120
|
-
get:function fn(_,p){ cds.error.no_primary_db(p,fn) }
|
|
121
|
-
})
|
|
122
|
-
|
|
123
|
-
// legacy and to be moved stuff -> hidden for tools in cds.__proto__
|
|
124
|
-
extend (cds.__proto__) .with (lazified ({
|
|
125
|
-
/** @deprecated */ in: (cwd) => !cwd ? cds : {__proto__:cds, cwd, env: cds.env.for('cds',cwd) },
|
|
126
|
-
mtx: lazy => require('../bin/mtx/in-cds'),
|
|
127
|
-
build: lazy => require('../bin/build'),
|
|
128
|
-
}))
|
|
129
|
-
|
|
130
|
-
// Add global forwards to cds.ql and cds.parse
|
|
131
|
-
const odp = Object.defineProperty, _global = (_,...pp) => pp.forEach (p => odp(global,p,{
|
|
132
|
-
configurable:true, get:()=>{ let v=cds[_][p]; odp(this,p,{value:v}); return v }
|
|
133
|
-
}))
|
|
134
|
-
_global ('ql','SELECT','INSERT','UPDATE','DELETE','CREATE','DROP')
|
|
135
|
-
_global ('parse','CDL','CQL','CXL')
|
|
136
|
-
|
|
137
|
-
// Check Node.js version
|
|
138
|
-
if (process.env.CDS_STRICT_NODE_VERSION !== 'false' && !process.env['WORKSPACE_ID']) { // FIXME remove as soon as BAS is ready for the Node version check below
|
|
139
|
-
const v = version => { let vv = version.split('.'); return { version, major: +vv[0], minor: +vv[1] }}
|
|
140
|
-
const required = v('12.18'), given = v(process.version.match(/^v(\d+\.\d+)/)[1])
|
|
141
|
-
if (given.major < required.major || given.major === required.major && given.minor < required.minor) process.exit (process.stderr.write (`
|
|
142
|
-
Node.js v${required.version} or higher is required for @sap/cds.
|
|
143
|
-
Current v${given.version} does not satisfy this.
|
|
144
|
-
\n`) || 1)
|
|
3
|
+
const facade = class cds extends require('events') {
|
|
4
|
+
|
|
5
|
+
get env() { return super.env = require('./env').for('cds',cds.root) }
|
|
6
|
+
get requires() { return super.requires = this.env.required_services_or_defs }
|
|
7
|
+
get version() { return super.version = require('../package.json').version }
|
|
8
|
+
get builtin() { return super.builtin = require('./core') }
|
|
9
|
+
get service() { return super.service = extend(this.builtin.classes.service) .with (_service) }
|
|
10
|
+
get _context() { return super._context = require('./req/cds-context') }
|
|
11
|
+
get context() { return this._context._for(this) }
|
|
12
|
+
set context(_){ this._context._for(this,_) }
|
|
13
|
+
get spawn() { return super.spawn = this._context.spawn }
|
|
14
|
+
|
|
15
|
+
emit (eve, ...args) {
|
|
16
|
+
if (eve === 'served') return Promise.all (this.listeners(eve).map (l => l.call(this,...args)))
|
|
17
|
+
else return super.emit (eve, ...args)
|
|
145
18
|
}
|
|
19
|
+
}
|
|
146
20
|
|
|
147
|
-
|
|
148
|
-
|
|
21
|
+
const { extend, lazify, lazified } = require ('./lazy')
|
|
22
|
+
const _class = lazy => cds.builtin.classes [lazy]
|
|
23
|
+
const _require = require; require = lazified (module) // eslint-disable-line
|
|
24
|
+
const _service = lazified ({ // nested facade for service-related modules
|
|
25
|
+
/** @param x {(this:Service, srv:Service, ...etc) => any} */ impl: x=>x,
|
|
26
|
+
/** @type {{ [path:string] : Service }} */ paths: {},
|
|
27
|
+
/** @type Service[] */ providers: [],
|
|
28
|
+
factory: require ('./serve/factory'),
|
|
29
|
+
adapters: require ('./serve/adapters'),
|
|
30
|
+
bindings: require ('./connect/bindings'),
|
|
31
|
+
})
|
|
32
|
+
|
|
33
|
+
/** cds is the central facade to all cds functions */
|
|
34
|
+
const cds = module.exports = extend (new facade) .with ({
|
|
35
|
+
|
|
36
|
+
// Builtin types and classes
|
|
37
|
+
Association:_class,
|
|
38
|
+
Composition:_class,
|
|
39
|
+
entity:_class,
|
|
40
|
+
event:_class,
|
|
41
|
+
type:_class,
|
|
42
|
+
array:_class,
|
|
43
|
+
struct:_class,
|
|
44
|
+
|
|
45
|
+
// Model Reflection
|
|
46
|
+
reflect: require ('./core/reflect'),
|
|
47
|
+
linked: require ('./core/reflect'),
|
|
48
|
+
infer: require ('./core/infer'),
|
|
49
|
+
|
|
50
|
+
// Loading and Compiling Models
|
|
51
|
+
model: undefined,
|
|
52
|
+
compiler: require ('./compile/cdsc'),
|
|
53
|
+
compile: require ('./compile'),
|
|
54
|
+
resolve: require ('./compile/resolve'),
|
|
55
|
+
load: require ('./compile/load'), get: lazy => cds.load.parsed,
|
|
56
|
+
parse: require ('./compile/parse'),
|
|
57
|
+
minify: require ('./compile/minify'),
|
|
58
|
+
extend: require ('./compile/extend'),
|
|
59
|
+
deploy: require ('./deploy'),
|
|
60
|
+
|
|
61
|
+
// Providing and Consuming Services
|
|
62
|
+
services: new class IterableServices {
|
|
63
|
+
*[Symbol.iterator]() {for (let e in this) yield this[e]}
|
|
64
|
+
get _pending(){ let p={}; Object.defineProperty(this,'_pending',{value:p}); return p }
|
|
65
|
+
},
|
|
66
|
+
serve: require ('./serve'),
|
|
67
|
+
server: require ('../server'),
|
|
68
|
+
connect: require ('./connect'),
|
|
69
|
+
|
|
70
|
+
// Core Services API
|
|
71
|
+
Service: require ('./serve/Service-api'),
|
|
72
|
+
EventContext: require ('./req/context'),
|
|
73
|
+
Request: require ('./req/request'),
|
|
74
|
+
Event: require ('./req/event'),
|
|
75
|
+
User: require ('./req/user'),
|
|
76
|
+
ql: require ('./ql'),
|
|
77
|
+
tx: (..._) => (cds.db || cds.Service.prototype) .tx (..._),
|
|
78
|
+
/** @type Service */ db: undefined,
|
|
79
|
+
|
|
80
|
+
// Protocols and Periphery
|
|
81
|
+
ApplicationService: lazy => require('../libx/_runtime/cds-services/services/Service.js'),
|
|
82
|
+
MessagingService: lazy => require('../libx/_runtime/messaging/service.js'),
|
|
83
|
+
DatabaseService: lazy => require('../libx/_runtime/db/Service.js'),
|
|
84
|
+
RemoteService: lazy => require('../libx/_runtime/remote/Service.js'),
|
|
85
|
+
AuditLogService: lazy => require('../libx/_runtime/audit/Service.js'),
|
|
86
|
+
odata: require('../libx/odata'),
|
|
87
|
+
|
|
88
|
+
// Helpers
|
|
89
|
+
localize: require ('./i18n/localize'),
|
|
90
|
+
error: require ('./log/errors'),
|
|
91
|
+
utils: require ('./utils'),
|
|
92
|
+
test: require ('./utils/tests'),
|
|
93
|
+
log: require ('./log'), debug: lazy => cds.log.debug,
|
|
94
|
+
exec: require ('../bin/cds'),
|
|
95
|
+
clone: m => JSON.parse (JSON.stringify(m)),
|
|
96
|
+
lazified, lazify,
|
|
97
|
+
|
|
98
|
+
// Configuration & Information
|
|
99
|
+
home: __dirname.slice(0,-4),
|
|
100
|
+
root: lazy => process.cwd(),
|
|
101
|
+
|
|
102
|
+
})
|
|
103
|
+
|
|
104
|
+
|
|
105
|
+
// cds as shortcut to cds.db -> for compatibility only
|
|
106
|
+
extend (cds.__proto__) .with ({
|
|
107
|
+
get entities(){ return (cds.db||_missing).entities },
|
|
108
|
+
transaction: (..._) => (cds.db||_missing).transaction(..._),
|
|
109
|
+
run: (..._) => (cds.db||_missing).run(..._),
|
|
110
|
+
foreach: (..._) => (cds.db||_missing).foreach(..._),
|
|
111
|
+
stream: (..._) => (cds.db||_missing).stream(..._),
|
|
112
|
+
read: (..._) => (cds.db||_missing).read(..._),
|
|
113
|
+
create: (..._) => (cds.db||_missing).create(..._),
|
|
114
|
+
insert: (..._) => (cds.db||_missing).insert(..._),
|
|
115
|
+
update: (..._) => (cds.db||_missing).update(..._),
|
|
116
|
+
delete: (..._) => (cds.db||_missing).delete(..._),
|
|
117
|
+
disconnect: (..._) => (cds.db||_missing).disconnect(..._),
|
|
118
|
+
})
|
|
119
|
+
/** @type Service */ const _missing = new Proxy ({},{
|
|
120
|
+
get:function fn(_,p){ cds.error._no_primary_db(p,fn) }
|
|
121
|
+
})
|
|
122
|
+
|
|
123
|
+
// legacy and to be moved stuff -> hidden for tools in cds.__proto__
|
|
124
|
+
extend (cds.__proto__) .with (lazified ({
|
|
125
|
+
/** @deprecated */ in: (cwd) => !cwd ? cds : {__proto__:cds, cwd, env: cds.env.for('cds',cwd) },
|
|
126
|
+
mtx: lazy => require('../bin/mtx/in-cds'),
|
|
127
|
+
build: lazy => require('../bin/build'),
|
|
128
|
+
}))
|
|
129
|
+
|
|
130
|
+
// Add global forwards to cds.ql and cds.parse
|
|
131
|
+
const odp = Object.defineProperty, _global = (_,...pp) => pp.forEach (p => odp(global,p,{
|
|
132
|
+
configurable:true, get:()=>{ let v=cds[_][p]; odp(this,p,{value:v}); return v }
|
|
133
|
+
}))
|
|
134
|
+
_global ('ql','SELECT','INSERT','UPDATE','DELETE','CREATE','DROP')
|
|
135
|
+
_global ('parse','CDL','CQL','CXL')
|
|
136
|
+
|
|
137
|
+
// Check Node.js version
|
|
138
|
+
if (process.env.CDS_STRICT_NODE_VERSION !== 'false') {
|
|
139
|
+
const v = version => { let vv = version.split('.'); return { version, major: +vv[0], minor: +vv[1] }}
|
|
140
|
+
const required = v('14.15'), given = v(process.version.match(/^v(\d+\.\d+)/)[1])
|
|
141
|
+
if (given.major < required.major || given.major === required.major && given.minor < required.minor) process.exit (process.stderr.write (`
|
|
142
|
+
Node.js v${required.version} or higher is required for @sap/cds.
|
|
143
|
+
Current v${given.version} does not satisfy this.
|
|
144
|
+
\n`) || 1)
|
|
149
145
|
}
|
|
146
|
+
|
|
147
|
+
// restore require for subsequent uses in lazy getters
|
|
148
|
+
require = _require // eslint-disable-line
|
|
149
|
+
|
|
150
|
+
if (process.env.CDS_GLOBAL) // TODO for stakeholder-tests only. Remove after cds 6.
|
|
151
|
+
Object.assign(module,{ exports: global.cds || (global.cds = cds)})
|
|
152
|
+
else
|
|
153
|
+
global.cds = cds
|
package/lib/log/errors.js
CHANGED
|
@@ -1,22 +1,65 @@
|
|
|
1
|
-
const
|
|
2
|
-
|
|
3
|
-
if (msg.raw) return _error (String.raw (msg,_details,_base,...etc))
|
|
4
|
-
const e = msg instanceof Error ? msg : new Error (msg)
|
|
5
|
-
if (_base) Error.captureStackTrace (e,_base)
|
|
6
|
-
if (_details) Object.assign (e,_details)
|
|
7
|
-
return e
|
|
8
|
-
}
|
|
1
|
+
const { format } = require('util'), _formatted = v => format(v)
|
|
2
|
+
|
|
9
3
|
|
|
10
|
-
|
|
11
|
-
|
|
4
|
+
/**
|
|
5
|
+
* This is the implementation of cds.error().
|
|
6
|
+
* Usage variants:
|
|
7
|
+
*
|
|
8
|
+
* cds.error `Message with formatted: ${{foo:'bar'}}`
|
|
9
|
+
* cds.error ({ message, code, ... })
|
|
10
|
+
* cds.error (message, { code, ... })
|
|
11
|
+
* let e = new cds.error(...) //> will not throw
|
|
12
|
+
*
|
|
13
|
+
* Calling `cds.error()` with `new` returns the newly created Error,
|
|
14
|
+
* while calling it without `new` it throws immediately. The latter is
|
|
15
|
+
* useful for usages like that:
|
|
16
|
+
*
|
|
17
|
+
* let x = y || cds.error `Argument 'y' must not be null`
|
|
18
|
+
*/
|
|
19
|
+
const error = exports = module.exports = function cds_error (msg, _details, _base) {
|
|
20
|
+
let e; if (msg.raw) e = new error (error.message(...arguments))
|
|
21
|
+
else {
|
|
22
|
+
e = msg.stack ? msg : typeof msg === 'string' ? new Error(msg) : Object.assign(new Error,msg)
|
|
23
|
+
Error.captureStackTrace (e,_base||error)
|
|
24
|
+
if (_details) Object.assign (e,_details)
|
|
25
|
+
}
|
|
26
|
+
if (new.target) return e; else throw e
|
|
12
27
|
}
|
|
13
28
|
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* Constructs a message from a tagged template string. In contrast to usual
|
|
32
|
+
* template strings embedded values are formatted using `util.format`
|
|
33
|
+
* not just `toString()`.
|
|
34
|
+
*
|
|
35
|
+
* let x = `A sample message with ${'a string'}, ${{an:'object'}}, and ${[1,2,3]}`
|
|
36
|
+
* let y = cds.error.message`with ${'a string'}, ${{an:'object'}}, and ${[1,2,3]}`
|
|
37
|
+
* //> x = A sample message with a string and [object Object], and 1,2,3
|
|
38
|
+
* //> y = with a string, { an: 'object' }, and [ 1, 2, 3 ]
|
|
39
|
+
*/
|
|
40
|
+
exports.message = (strings,...values) => String.raw(strings,...values.map(_formatted))
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* Use that to construct and throw errors from a tagged template string
|
|
45
|
+
* in validations of function arguments.
|
|
46
|
+
* Use it like that:
|
|
47
|
+
*
|
|
48
|
+
* let x = {foo:'bar'}
|
|
49
|
+
* typeof x === 'string' || cds.error.expected `${{x}} to be a string`
|
|
50
|
+
* //> Error: Expected argument 'x' to be a string, but got: { foo: 'bar' }
|
|
51
|
+
*/
|
|
14
52
|
exports.expected = ([,type], arg) => {
|
|
15
53
|
const [ name, value ] = Object.entries(arg)[0]
|
|
16
54
|
return error `Expected argument '${name}'${type}, but got: ${require('util').inspect(value,{depth:11})}`
|
|
17
55
|
}
|
|
18
56
|
|
|
19
|
-
|
|
57
|
+
|
|
58
|
+
//
|
|
59
|
+
// Private helpers ...
|
|
60
|
+
//
|
|
61
|
+
|
|
62
|
+
exports._duplicate_cds = (...locations) => {
|
|
20
63
|
const { local } = require('../utils')
|
|
21
64
|
throw error `Duplicate @sap/cds/common!
|
|
22
65
|
|
|
@@ -29,7 +72,7 @@ exports.duplicate_cds = (...locations) => {
|
|
|
29
72
|
`
|
|
30
73
|
}
|
|
31
74
|
|
|
32
|
-
exports.
|
|
75
|
+
exports._no_primary_db = (p,_base) => error (`Not connected to primary datasource!
|
|
33
76
|
|
|
34
77
|
Attempt to use 'cds.${p}' without prior connect to primary datasource,
|
|
35
78
|
i.e. cds.connect.to('db').
|
package/lib/log/format/kibana.js
CHANGED
|
@@ -57,5 +57,5 @@ module.exports = (module, level, ...args) => {
|
|
|
57
57
|
}
|
|
58
58
|
|
|
59
59
|
// return array with the stringified toLog (to avoid multiple log lines) as the sole element
|
|
60
|
-
return [
|
|
60
|
+
return [util.inspect(toLog, { compact: true, breakLength: Infinity, depth: null })]
|
|
61
61
|
}
|
package/lib/log/index.js
CHANGED
|
@@ -122,6 +122,10 @@ exports.Logger = (module, level) => {
|
|
|
122
122
|
*/
|
|
123
123
|
exports.format = (
|
|
124
124
|
process.env.NODE_ENV === 'production' && cds.env.features.kibana_formatter ? require('./format/kibana')
|
|
125
|
+
: cds.requires.multitenancy ? (module, level, ...args) => {
|
|
126
|
+
const t = cds.context?.tenant
|
|
127
|
+
return [ t ? `[${module}|${t}]` : `[${module}]`, '-', ...args ]
|
|
128
|
+
}
|
|
125
129
|
: (module, level, ...args) => [ `[${module}] -`, ...args ]
|
|
126
130
|
)
|
|
127
131
|
|
package/lib/ql/SELECT.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
const Whereable = require('./Whereable'), { parse, predicate4 } = Whereable
|
|
2
|
-
const
|
|
2
|
+
const cds = require('../index')
|
|
3
3
|
|
|
4
4
|
|
|
5
5
|
module.exports = class SELECT extends Whereable {
|
|
@@ -120,13 +120,18 @@ module.exports = class SELECT extends Whereable {
|
|
|
120
120
|
return this
|
|
121
121
|
}
|
|
122
122
|
|
|
123
|
-
forUpdate ({ of, wait =
|
|
123
|
+
forUpdate ({ of, wait = cds.env.sql.lock_acquire_timeout || -1 } = {}) {
|
|
124
124
|
const sfu = this.SELECT.forUpdate = {}
|
|
125
125
|
if (of) sfu.of = of.map (c => ({ref:c.split('.')}))
|
|
126
126
|
if (wait >= 0) sfu.wait = wait
|
|
127
127
|
return this
|
|
128
128
|
}
|
|
129
129
|
|
|
130
|
+
forShareLock () {
|
|
131
|
+
this.SELECT.forShareLock = true
|
|
132
|
+
return this
|
|
133
|
+
}
|
|
134
|
+
|
|
130
135
|
foreach (callback) {
|
|
131
136
|
return this.then(rows => rows.map(callback))
|
|
132
137
|
}
|
package/lib/ql/Whereable.js
CHANGED
|
@@ -2,6 +2,11 @@ const { error } = require ('../index')
|
|
|
2
2
|
const cds = require('../index')
|
|
3
3
|
const parse = require('./parse')
|
|
4
4
|
|
|
5
|
+
const _setIncludesOr = where => {
|
|
6
|
+
if (where.includes('or')) Object.defineProperty(where,'_includes_or__',{value:1})
|
|
7
|
+
else Object.defineProperty(where,'_includes_or__',{value:0})
|
|
8
|
+
}
|
|
9
|
+
|
|
5
10
|
class Whereable extends require('./Query') {
|
|
6
11
|
|
|
7
12
|
where(...x) { return this._where (x,'and','where') }
|
|
@@ -20,11 +25,12 @@ class Whereable extends require('./Query') {
|
|
|
20
25
|
if (_clause === 'on') _ = _.from
|
|
21
26
|
let left = this._own(_clause,_)
|
|
22
27
|
if (!left) {
|
|
23
|
-
|
|
28
|
+
_setIncludesOr(pred)
|
|
24
29
|
_[_clause] = pred
|
|
25
30
|
} else {
|
|
26
31
|
if (and_or === 'and') {
|
|
27
|
-
if (left._includes_or__) left
|
|
32
|
+
if (left._includes_or__ === undefined) _setIncludesOr(left) // information might be lost while copying
|
|
33
|
+
if (left._includes_or__ === 1) left = [{xpr:left}]
|
|
28
34
|
if (pred.includes('or')) pred = [{xpr:pred}]
|
|
29
35
|
}
|
|
30
36
|
_[_clause] = [ ...left, and_or, ...pred ]
|
package/lib/ql/index.js
CHANGED
|
@@ -23,9 +23,9 @@ function _deprecated_srv_ql() { // eslint-disable-next-line no-console
|
|
|
23
23
|
}
|
|
24
24
|
|
|
25
25
|
if (cds.env.features.cls && cds.env.features.debug_queries) {
|
|
26
|
-
const Query =
|
|
26
|
+
const Query = require('./Query'), { then } = Query.prototype
|
|
27
27
|
const { AsyncResource } = require('async_hooks')
|
|
28
|
-
Object.defineProperty (Query,'then',{ get(){
|
|
28
|
+
Object.defineProperty (Query.prototype,'then',{ get(){
|
|
29
29
|
const q = new AsyncResource('cds.Query')
|
|
30
30
|
return (r,e) => q.runInAsyncScope (then,this,r,e)
|
|
31
31
|
}})
|