@sap/cds 5.9.6 → 6.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +266 -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 +90 -53
- package/bin/build/provider/mtx/resourcesTarBuilder.js +68 -0
- package/bin/build/provider/mtx-sidecar/index.js +80 -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 +19 -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 +9 -10
- package/bin/{build → deploy/to-hana}/mtaUtil.js +10 -9
- package/bin/mtx/in-cds.js +19 -7
- package/bin/serve.js +56 -21
- package/bin/utils/log.js +13 -30
- package/bin/version.js +5 -4
- 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 +11 -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 +70 -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 +23 -20
- package/lib/serve/index.js +51 -54
- package/lib/utils/axios.js +8 -12
- package/lib/utils/index.js +3 -3
- 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 +128 -42
- package/libx/_runtime/cds-services/adapter/odata-v4/OData.js +6 -3
- package/libx/_runtime/cds-services/adapter/odata-v4/ODataRequest.js +93 -73
- package/libx/_runtime/cds-services/adapter/odata-v4/handlers/action.js +10 -45
- package/libx/_runtime/cds-services/adapter/odata-v4/handlers/create.js +5 -9
- 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 +1 -1
- package/libx/_runtime/cds-services/adapter/odata-v4/handlers/update.js +15 -21
- 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 +100 -91
- 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 +77 -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 +16 -18
- 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 +15 -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 +11 -4
- 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 +6 -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 +3 -7
- package/libx/_runtime/fiori/generic/index.js +31 -0
- package/libx/_runtime/fiori/generic/new.js +2 -4
- package/libx/_runtime/fiori/generic/patch.js +4 -8
- package/libx/_runtime/fiori/generic/prepare.js +2 -4
- package/libx/_runtime/fiori/generic/read.js +137 -162
- package/libx/_runtime/fiori/generic/readOverDraft.js +10 -4
- package/libx/_runtime/fiori/utils/handler.js +10 -5
- 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 +11 -2
- 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 +2 -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 +84 -46
- 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 +261 -157
- 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/server.js
CHANGED
|
@@ -20,13 +20,12 @@ const express = require('express')
|
|
|
20
20
|
* @param {express.Application} options.app - filenames of models to load; default: '*'
|
|
21
21
|
* @param {express.Handler} options.index - custom handler for /
|
|
22
22
|
* @param {express.Handler} options.favicon - custom handler for /favicon.ico
|
|
23
|
-
* @param {express.Handler} options.logger - custom request logger middleware
|
|
24
23
|
* @returns Promise resolving to a Node.js http server as returned by express' `app.listen()`.
|
|
25
24
|
*/
|
|
26
25
|
module.exports = async function cds_server (options) {
|
|
27
26
|
|
|
28
27
|
const _in_prod = process.env.NODE_ENV === 'production'
|
|
29
|
-
const o =
|
|
28
|
+
const o = { ...options, __proto__:defaults }
|
|
30
29
|
|
|
31
30
|
const app = cds.app = o.app || express()
|
|
32
31
|
app.serve = _app_serve //> app.serve allows delegating to sub modules
|
|
@@ -38,27 +37,21 @@ module.exports = async function cds_server (options) {
|
|
|
38
37
|
if (o.favicon) app.use ('/favicon.ico', o.favicon) //> if none in ./app
|
|
39
38
|
if (o.index) app.get ('/',o.index) //> if none in ./app
|
|
40
39
|
if (o.correlate) app.use (o.correlate) //> request correlation
|
|
41
|
-
if (o.logger) app.use (o.logger) //> basic request logging
|
|
42
|
-
if (o.toggler) app.use (o.toggler) //> feature toggler
|
|
43
40
|
|
|
44
41
|
// load specified models or all in project
|
|
45
42
|
const csn = await cds.load(o.from||'*',o) .then (cds.minify) //> separate csn for _init_db
|
|
46
43
|
cds.model = cds.compile.for.nodejs(csn)
|
|
47
44
|
|
|
48
45
|
// connect to essential framework services if required
|
|
49
|
-
if (cds.requires.extensibility) await _extensibility() //> has to go first
|
|
50
46
|
if (cds.requires.db) cds.db = await cds.connect.to ('db') .then (_init)
|
|
51
47
|
if (cds.requires.messaging) await cds.connect.to ('messaging')
|
|
52
|
-
if (cds.requires.multitenancy) await _multitenancy()
|
|
53
|
-
if (cds.requires.toggles) await _model_provider()
|
|
54
48
|
|
|
55
49
|
// serve all services declared in models
|
|
56
|
-
if (features.graphql) serve_graphql(app)
|
|
57
50
|
await cds.serve (o.service,o) .in (app)
|
|
58
51
|
await cds.emit ('served', cds.services) //> hook for listeners
|
|
59
52
|
|
|
60
53
|
// start http server
|
|
61
|
-
const port = (o.port !== undefined) ? o.port : (process.env.PORT || 4004)
|
|
54
|
+
const port = (o.port !== undefined) ? o.port : (process.env.PORT || cds.env.server?.port || 4004)
|
|
62
55
|
return app.listen (port)
|
|
63
56
|
|
|
64
57
|
// bootstrap in-memory db
|
|
@@ -71,12 +64,6 @@ module.exports = async function cds_server (options) {
|
|
|
71
64
|
|
|
72
65
|
}
|
|
73
66
|
|
|
74
|
-
// REVISIT: Move these out of here...
|
|
75
|
-
const _model_provider = () => require('./libx/_runtime/extensibility/mps')
|
|
76
|
-
const _extensibility = () => require('./libx/_runtime/extensibility/uiflex')
|
|
77
|
-
const _multitenancy = () => features.streamlined_mtx ? _model_provider() : cds.mtx.in (cds.app)
|
|
78
|
-
|
|
79
|
-
|
|
80
67
|
|
|
81
68
|
// -------------------------------------------------------------------------
|
|
82
69
|
// Default handlers, which can be overidden by options passed to the server
|
|
@@ -97,25 +84,7 @@ const defaults = {
|
|
|
97
84
|
get favicon() {
|
|
98
85
|
const favicon = require.resolve ('./app/favicon.ico')
|
|
99
86
|
return express.static (favicon, {maxAge:'14d'})
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
// default request logger
|
|
103
|
-
get logger() {
|
|
104
|
-
const LOG = cds.log(), DEBUG = cds.debug('server')
|
|
105
|
-
return (req,_,next) => {
|
|
106
|
-
LOG && LOG (req.method, decodeURI(req.url), req.body||'')
|
|
107
|
-
if (/\$batch/.test(req.url)) req.on ('dispatch', (req) => {
|
|
108
|
-
LOG && LOG ('>', req.event, decodeURI(req._path), req._query||'')
|
|
109
|
-
if (DEBUG && req.query) DEBUG (req.query)
|
|
110
|
-
})
|
|
111
|
-
next()
|
|
112
|
-
}
|
|
113
|
-
},
|
|
114
|
-
|
|
115
|
-
// feature toggler
|
|
116
|
-
get toggler() {
|
|
117
|
-
return require('./libx/_runtime/common/toggles/handler')(cds)
|
|
118
|
-
}
|
|
87
|
+
}
|
|
119
88
|
}
|
|
120
89
|
|
|
121
90
|
|
|
@@ -130,16 +99,6 @@ const _app_serve = function (endpoint) { return {
|
|
|
130
99
|
}}
|
|
131
100
|
|
|
132
101
|
|
|
133
|
-
// register graphql router on served event
|
|
134
|
-
function serve_graphql (app) {
|
|
135
|
-
cds.on('served', services => {
|
|
136
|
-
const GraphQLAdapter = require('./libx/gql/GraphQLAdapter')
|
|
137
|
-
app.use(new GraphQLAdapter(services, { graphiql: true }))
|
|
138
|
-
cds.log()("serving GraphQL endpoint for all services { at: '/graphql' }")
|
|
139
|
-
})
|
|
140
|
-
}
|
|
141
|
-
|
|
142
|
-
|
|
143
102
|
function cors (req, res, next) {
|
|
144
103
|
const { origin } = req.headers
|
|
145
104
|
if (origin) res.set('access-control-allow-origin', origin)
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
using { cds.xt.Extensions } from './extensions';
|
|
2
|
+
using { cds.xt.TAR } from './model-provider';
|
|
3
|
+
|
|
4
|
+
@protocol: 'rest'
|
|
5
|
+
@(requires : 'authenticated-user')
|
|
6
|
+
service cds.xt.ExtensibilityService @(path:'/-/cds/extensibility') {
|
|
7
|
+
// TODO: allow-lists - custom before('add') handler
|
|
8
|
+
// TODO: async jobs
|
|
9
|
+
|
|
10
|
+
type ActivationLevel : Extensions:activated;
|
|
11
|
+
type CSN: String; // REVISIT: should reuse cds.xt.CSN
|
|
12
|
+
type CSN_OR_CDL: String;
|
|
13
|
+
|
|
14
|
+
// UIFLEX API
|
|
15
|
+
@(requires : ['cds.UIFlexDeveloper', 'cds.ExtensionDeveloper'])
|
|
16
|
+
action addExtension(extensions : array of CSN); // REVISIT: change to array of CSN extensions
|
|
17
|
+
|
|
18
|
+
// Experimantal API
|
|
19
|
+
@(requires : ['cds.ExtensionDeveloper', 'internal-user'])
|
|
20
|
+
action add(
|
|
21
|
+
extension : CSN_OR_CDL,
|
|
22
|
+
tag : Extensions:tag, // optional
|
|
23
|
+
activate : ActivationLevel, // optional, default = 'database'
|
|
24
|
+
tenant : String // optional, for internal-user only
|
|
25
|
+
);
|
|
26
|
+
|
|
27
|
+
// Experimantal API
|
|
28
|
+
@(requires : ['cds.ExtensionDeveloper', 'internal-user'])
|
|
29
|
+
action promote(
|
|
30
|
+
tag : Extensions:tag, // optional
|
|
31
|
+
activate : ActivationLevel, // optional, default = 'database'
|
|
32
|
+
tenant : String // optional, for internal-user only
|
|
33
|
+
);
|
|
34
|
+
|
|
35
|
+
// REVISIT: consider implementing delete
|
|
36
|
+
// action delete(tenant: String, tag: Extensions:tag);
|
|
37
|
+
|
|
38
|
+
// EXTENSION PROJECT
|
|
39
|
+
// deprecated - mimics current cds extend returning TAR (w/o features)
|
|
40
|
+
// only features configured for tenant
|
|
41
|
+
@(requires : ['cds.ExtensionDeveloper'])
|
|
42
|
+
function base() returns TAR;
|
|
43
|
+
|
|
44
|
+
@(requires : ['cds.ExtensionDeveloper'])
|
|
45
|
+
action push (
|
|
46
|
+
extension : TAR // TODO: i18n, csv
|
|
47
|
+
// tag : Extensions:tag,
|
|
48
|
+
// activate : ActivationLevel
|
|
49
|
+
);
|
|
50
|
+
|
|
51
|
+
// REVISIT: separate action for transport -> later
|
|
52
|
+
|
|
53
|
+
event tenantUpdated {
|
|
54
|
+
tenant: String;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
module.exports = require('../libx/_runtime/extensibility/service')
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
entity cds.xt.Extensions {
|
|
2
|
+
key ID : UUID;
|
|
3
|
+
tag : String; //> e.g.: uiflex, custom, ...
|
|
4
|
+
csn : String;
|
|
5
|
+
sources : LargeBinary; // TAR
|
|
6
|
+
activated : String enum { propertyBag; database };
|
|
7
|
+
timestamp : Timestamp @cds.on.insert:$now @cds.on.update:$now; // to support invalidation of models
|
|
8
|
+
}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
context cds.xt { // IMPORTANT: we don't use namespaces to avoid issues with cds.db default namespace
|
|
2
|
+
|
|
3
|
+
@open type CSN {};
|
|
4
|
+
type TAR : LargeBinary;
|
|
5
|
+
type XML : LargeString;
|
|
6
|
+
type Locale : String;
|
|
7
|
+
type TenantID : String;
|
|
8
|
+
type CSNConsumer : String enum { nodejs; java; };
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Used by CAP runtimes to retrieve tenant-specific variants of
|
|
13
|
+
* deployed models used to serve requests.
|
|
14
|
+
*/
|
|
15
|
+
@protocol: 'rest'
|
|
16
|
+
@requires: [ 'internal-user' ] //> we check that ourselves programmatically in production only
|
|
17
|
+
service ModelProviderService @(path:'/-/cds/model-provider', impl:'@sap/cds/srv/model-provider.js') {
|
|
18
|
+
|
|
19
|
+
action getCsn(
|
|
20
|
+
tenant : TenantID,
|
|
21
|
+
toggles : array of String,
|
|
22
|
+
for : CSNConsumer @cds.java.name: 'runtime',
|
|
23
|
+
) returns CSN;
|
|
24
|
+
|
|
25
|
+
action getExtCsn(
|
|
26
|
+
tenant : TenantID,
|
|
27
|
+
toggles : array of String,
|
|
28
|
+
for : CSNConsumer @cds.java.name: 'runtime',
|
|
29
|
+
) returns CSN;
|
|
30
|
+
|
|
31
|
+
action getEdmx(
|
|
32
|
+
tenant : TenantID,
|
|
33
|
+
toggles : array of String,
|
|
34
|
+
service : String,
|
|
35
|
+
locale : Locale,
|
|
36
|
+
flavor : String,
|
|
37
|
+
for : CSNConsumer @cds.java.name: 'runtime',
|
|
38
|
+
) returns XML;
|
|
39
|
+
|
|
40
|
+
action isExtended(
|
|
41
|
+
tenant : TenantID,
|
|
42
|
+
) returns Boolean;
|
|
43
|
+
|
|
44
|
+
action getExtensions(
|
|
45
|
+
tenant : TenantID,
|
|
46
|
+
) returns CSN;
|
|
47
|
+
|
|
48
|
+
action getResources () returns TAR;
|
|
49
|
+
action getExtResources() returns TAR;
|
|
50
|
+
|
|
51
|
+
// -------------------------------
|
|
52
|
+
// Later, possibly:
|
|
53
|
+
// function GET csn(...)
|
|
54
|
+
// function GET edmx(...)
|
|
55
|
+
// function GET extended(...)
|
|
56
|
+
// function GET resources(...)
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
}
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
/* eslint-disable no-console */
|
|
2
|
+
const fs = require('fs')
|
|
3
|
+
const path = require('path')
|
|
4
|
+
|
|
5
|
+
const cds = require('../libx/_runtime/cds')
|
|
6
|
+
const DEBUG = cds.debug('mtx')
|
|
7
|
+
|
|
8
|
+
const { packTarArchive, unpackTarArchive } = require('../lib/utils/resources')
|
|
9
|
+
const { collectFiles } = require('../libx/_runtime/extensibility/utils')
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
const TEMP_DIR = fs.realpathSync(require('os').tmpdir())
|
|
13
|
+
|
|
14
|
+
module.exports = class ModelProviderService extends cds.Service {
|
|
15
|
+
|
|
16
|
+
get _add_stub_methods(){ return true }
|
|
17
|
+
init() {
|
|
18
|
+
|
|
19
|
+
// REVISIT: We should do the enforcement only in production
|
|
20
|
+
// let requires = this.definition['@requires_']
|
|
21
|
+
// if (requires && process.env.NODE_ENV === 'production') this.before ('*', req => {
|
|
22
|
+
// if (!cds.context?.http) return //> not called from external
|
|
23
|
+
// if (req.user._is_anonymous) return req.reject({ code:401 })
|
|
24
|
+
// if (!requires.some(r => req.user.is(r))) return req.reject({ code:403 })
|
|
25
|
+
// })
|
|
26
|
+
|
|
27
|
+
this.on('getCsn', req => _getCsn(req, false, this._nodejs_models))
|
|
28
|
+
this.on('getExtCsn', req => _getExtCsn(req, this._nodejs_models))
|
|
29
|
+
this.on('getEdmx', async req => {
|
|
30
|
+
const { service, locale, flavor } = req.data
|
|
31
|
+
const csn = await _getCsn(req, false, this._nodejs_models)
|
|
32
|
+
const edmx = cds.compile.to.edmx(csn, { service, flavor })
|
|
33
|
+
const {res} = req._; if (res) res.set('Content-Type', 'application/xml')
|
|
34
|
+
return cds.localize(csn, locale, edmx)
|
|
35
|
+
})
|
|
36
|
+
|
|
37
|
+
this.on('getResources', async req => {
|
|
38
|
+
if (req._.res) req._.res.set('content-type', 'application/octet-stream; charset=binary')
|
|
39
|
+
// REVISIT: Works only w/o encoding parameter. Default encoding is 'utf8'.
|
|
40
|
+
// try { return await cds.utils.read('resources.tgz') }
|
|
41
|
+
// root is defined in cds.requires, in case of the sidecar scenario it is set to "_main"
|
|
42
|
+
try { return await require('fs').promises.readFile(require('path').resolve(cds.root, conf?.root || '', 'resources.tgz')) }
|
|
43
|
+
catch(e) { if (e.code !== 'ENOENT') throw e }
|
|
44
|
+
const files = Object.keys(await cds.deploy.resources(['*', cds.env.features.folders]))
|
|
45
|
+
if (!files.length) return req.reject(404)
|
|
46
|
+
if (req._.res) req._.res.set('content-type', 'application/octet-stream; charset=binary')
|
|
47
|
+
return packTarArchive(files, cds.root)
|
|
48
|
+
})
|
|
49
|
+
|
|
50
|
+
this.on('getExtResources', async req => {
|
|
51
|
+
if (!cds.requires.extensibility) return req.reject(400, 'Missing extensibility parameter')
|
|
52
|
+
const rs = await run4 (req.data.tenant, SELECT('sources').from('cds.xt.Extensions'))
|
|
53
|
+
if (!rs.length) return req.reject(404, 'Missing extensions')
|
|
54
|
+
if (rs.every(row => row.sources === null)) return req.reject(404, 'Extension resources not found')
|
|
55
|
+
if (req._.res) req._.res.set('content-type', 'application/octet-stream; charset=binary')
|
|
56
|
+
const temp = await fs.promises.mkdtemp(`${TEMP_DIR}${path.sep}tar-`)
|
|
57
|
+
try {
|
|
58
|
+
await Promise.all (rs.map (row => unpackTarArchive(Buffer.from(JSON.parse(row.sources)), temp, false)))
|
|
59
|
+
return await packTarArchive(collectFiles(temp, ['.csv', '.properties']), temp)
|
|
60
|
+
} finally {
|
|
61
|
+
await (fs.promises.rm || fs.promises.rmdir)(temp, { recursive: true, force: true }).catch(()=>{})
|
|
62
|
+
}
|
|
63
|
+
})
|
|
64
|
+
|
|
65
|
+
this.on('isExtended', async req => _isExtended(req.data.tenant))
|
|
66
|
+
|
|
67
|
+
this.on('getExtensions', async req => {
|
|
68
|
+
if (!cds.requires.extensibility) return req.reject(400, 'Missing extensibility parameter')
|
|
69
|
+
const exts = await run4 (req.data.tenant, SELECT('csn').from('cds.xt.Extensions'))
|
|
70
|
+
if (!exts.length) return req.reject(404, 'Missing extensions')
|
|
71
|
+
|
|
72
|
+
const csn = { extensions: [], definitions: {} }
|
|
73
|
+
exts.forEach(ext => {
|
|
74
|
+
const extCsn = JSON.parse(ext.csn)
|
|
75
|
+
csn.extensions.push(...extCsn.extensions)
|
|
76
|
+
if (extCsn.definitions) csn.definitions = Object.assign(extCsn.definitions, csn.definitions)
|
|
77
|
+
})
|
|
78
|
+
|
|
79
|
+
return csn
|
|
80
|
+
})
|
|
81
|
+
|
|
82
|
+
this.invalidateCache = tenant => {
|
|
83
|
+
for (const key in this._nodejs_models) {
|
|
84
|
+
if (key.startsWith( `${tenant}:`)) {
|
|
85
|
+
delete this._nodejs_models[key]
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
// Conf vars required by getCsn ------------------------------------------
|
|
91
|
+
// eslint-disable-next-line one-var
|
|
92
|
+
const conf = cds.env.requires['cds.xt.ModelProviderService'] || cds.env.requires.kinds['cds.xt.ModelProviderService']
|
|
93
|
+
DEBUG && DEBUG ('ModelProviderService options:', conf)
|
|
94
|
+
const options = {}
|
|
95
|
+
if (conf.root) {
|
|
96
|
+
options.root = path.resolve (cds.root, conf.root)
|
|
97
|
+
options.env = cds.env.for('cds', options.root)
|
|
98
|
+
options.cache = {}
|
|
99
|
+
}
|
|
100
|
+
const fts = cds.env.features.folders
|
|
101
|
+
if (conf.kind !== 'in-sidecar') this._nodejs_models = {}
|
|
102
|
+
|
|
103
|
+
/** The implementation for getCsn */
|
|
104
|
+
async function _getCsn (req, checkExt, cache) {
|
|
105
|
+
const { toggles, for:javaornode } = req.data
|
|
106
|
+
const features = !toggles ? [] : toggles === '*' || toggles.includes('*') ? [fts] : toggles.map (f => fts.replace('*',f))
|
|
107
|
+
const isExtended = await _isExtended(req.data.tenant)
|
|
108
|
+
if (checkExt && !isExtended) req.reject(404, 'Missing extensions')
|
|
109
|
+
const hash = `${isExtended ? req.data.tenant : undefined}:${features.join(',')}`
|
|
110
|
+
if (javaornode && cache && cache[hash]) return cache[hash]
|
|
111
|
+
|
|
112
|
+
const models = cds.resolve(['*',...features], options)
|
|
113
|
+
if (!models) return
|
|
114
|
+
|
|
115
|
+
DEBUG && DEBUG ('loading models from', models)
|
|
116
|
+
let csn = await cds.load(models).then(cds.minify)
|
|
117
|
+
if (isExtended) csn = await _addExtensions(csn, req.data.tenant)
|
|
118
|
+
if (javaornode) csn = cds.compile.for[javaornode](csn)
|
|
119
|
+
|
|
120
|
+
// Dirty hack for cds.localize in Node sidecar setup
|
|
121
|
+
Object.defineProperty(csn,'$sources',{ value:csn.$sources, enumerable:true })
|
|
122
|
+
|
|
123
|
+
if (javaornode && cache) cache[hash] = csn
|
|
124
|
+
|
|
125
|
+
return csn
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
async function _getExtCsn (req, cache) {
|
|
129
|
+
if (!cds.requires.extensibility) return req.reject(400, 'Missing extensibility parameter')
|
|
130
|
+
return _getCsn (req, true, cache)
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
|
|
136
|
+
const run4 = (t,q) => t ? cds.tx({tenant:t}, tx => tx.run(q)) : q
|
|
137
|
+
|
|
138
|
+
/** Add extensions if applicable and exist */
|
|
139
|
+
const _addExtensions = async (csn, tenant) => {
|
|
140
|
+
const exts = await run4 (tenant, SELECT('csn').from('cds.xt.Extensions'))
|
|
141
|
+
if (!exts.length) return csn
|
|
142
|
+
|
|
143
|
+
const all = { definitions: {}, extensions: [] }
|
|
144
|
+
for (const each of exts) {
|
|
145
|
+
const ext = JSON.parse(each.csn)
|
|
146
|
+
if (ext.definitions) Object.assign(all.definitions, ext.definitions)
|
|
147
|
+
if (ext.extensions) all.extensions.push(...ext.extensions)
|
|
148
|
+
}
|
|
149
|
+
const extended = cds.compile({
|
|
150
|
+
'base.csn': cds.compile.to.json(csn),
|
|
151
|
+
'ext.csn': cds.compile.to.json(all)
|
|
152
|
+
})
|
|
153
|
+
extended.$sources = csn.$sources // required to load resources like i18n later on
|
|
154
|
+
|
|
155
|
+
return extended
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
async function _isExtended (tenant) {
|
|
159
|
+
if (!cds.requires.extensibility) return false
|
|
160
|
+
if (!tenant && cds.requires.multitenancy) return false
|
|
161
|
+
const one = await run4 (tenant, SELECT.one(1).from('cds.xt.Extensions'))
|
|
162
|
+
return !!one
|
|
163
|
+
}
|
package/srv/mtx.cds
ADDED
package/srv/mtx.js
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
const cds = require ('../lib')
|
|
2
|
+
class MTXServices extends cds.Service { async init(){
|
|
3
|
+
if (cds.mtx) return cds.mtx?.in (cds.app) // old mtx
|
|
4
|
+
// else...
|
|
5
|
+
let sources = []
|
|
6
|
+
if (cds.requires.multitenancy) {
|
|
7
|
+
if (!('cds.xt.DeploymentService' in cds.requires)) {
|
|
8
|
+
sources.push('@sap/cds-mtxs/srv/deployment-service')
|
|
9
|
+
if (!('cds.xt.SaasProvisioningService' in cds.requires)) sources.push('@sap/cds-mtxs/srv/cf/saas-provisioning-service')
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
if (cds.requires.extensibility) {
|
|
13
|
+
if (!('cds.xt.ExtensibilityService' in cds.requires)) sources.push('@sap/cds/srv/extensibility-service')
|
|
14
|
+
}
|
|
15
|
+
if (cds.requires.toggles) {
|
|
16
|
+
if (!('cds.xt.ModelProviderService' in cds.requires)) sources.push('@sap/cds/srv/model-provider')
|
|
17
|
+
}
|
|
18
|
+
let models = cds.resolve(sources); if (!models) return
|
|
19
|
+
let base = cds.model.$sources; models = models.filter(m => !base.includes(m))
|
|
20
|
+
if (models.length) return cds.serve(models).in(cds.app)
|
|
21
|
+
}}
|
|
22
|
+
module.exports = MTXServices
|
package/srv/outbox.cds
CHANGED
|
@@ -26,18 +26,25 @@ const oa2 = {
|
|
|
26
26
|
const main = async () => {
|
|
27
27
|
// use authorizedRequest to fire against deploy endpoint
|
|
28
28
|
// (use credentials of XSUAA)
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
29
|
+
LOG._info && LOG.info('Deploy all tenants')
|
|
30
|
+
try {
|
|
31
|
+
const { body } = await authorizedRequest({
|
|
32
|
+
method: 'POST',
|
|
33
|
+
uri: optionsApp.appURL,
|
|
34
|
+
path: '/messaging/enterprise-messaging/deploy',
|
|
35
|
+
dataObj: { tenants: ['all'] },
|
|
36
|
+
oa2,
|
|
37
|
+
tokenStore
|
|
38
|
+
})
|
|
39
|
+
LOG._info && LOG.info('Deployment complete:', body)
|
|
40
|
+
} catch (e) {
|
|
41
|
+
const error = new Error(`Deployment failed`)
|
|
42
|
+
error.code = 'DEPLOY_FAILED'
|
|
43
|
+
error.target = { kind: 'DEPLOYMENT' }
|
|
44
|
+
error.reason = e
|
|
45
|
+
this.LOG.error(error)
|
|
46
|
+
throw error
|
|
47
|
+
}
|
|
41
48
|
}
|
|
42
49
|
|
|
43
50
|
main()
|
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
|
|
2
|
-
// Compatibility with srv.emit() used for sync events...
|
|
3
|
-
|
|
4
|
-
const sync_events = {
|
|
5
|
-
CREATE: 1,
|
|
6
|
-
READ: 1,
|
|
7
|
-
UPDATE: 1,
|
|
8
|
-
DELETE: 1,
|
|
9
|
-
INSERT: 1,
|
|
10
|
-
GET: 1,
|
|
11
|
-
PUT: 1,
|
|
12
|
-
POST: 1,
|
|
13
|
-
PATCH: 1,
|
|
14
|
-
BEGIN: 1,
|
|
15
|
-
COMMIT: 1,
|
|
16
|
-
ROLLBACK: 1,
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
const sync_emit = (srv, req) => {
|
|
20
|
-
// eslint-disable-next-line no-console
|
|
21
|
-
console.trace(`\n
|
|
22
|
-
[Deprecated] - srv.emit() used to send synchronous '${req.event}' request.
|
|
23
|
-
Please change this to use srv.send() instead.
|
|
24
|
-
`)
|
|
25
|
-
return srv.dispatch(req)
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
const {cds} = global
|
|
29
|
-
module.exports = function (event, data, headers) {
|
|
30
|
-
if (event instanceof cds.Request)
|
|
31
|
-
return sync_emit (this, event)
|
|
32
|
-
if (event in sync_events)
|
|
33
|
-
return sync_emit (this, new cds.Request({ event, data, headers }))
|
|
34
|
-
if ((typeof event === 'object' && event.query) || (event.event || event.method) in sync_events)
|
|
35
|
-
return sync_emit (this, new cds.Request(event))
|
|
36
|
-
}
|
|
@@ -1,45 +0,0 @@
|
|
|
1
|
-
const cds = require('../../cds')
|
|
2
|
-
const LOG = cds.log()
|
|
3
|
-
|
|
4
|
-
function decode(req, header, encoded) {
|
|
5
|
-
if (!req.headers[header]) return
|
|
6
|
-
if (encoded) return JSON.parse(Buffer.from(req.headers[header], 'base64').toString('utf-8'))
|
|
7
|
-
return req.headers[header]
|
|
8
|
-
}
|
|
9
|
-
|
|
10
|
-
class DwcStrategy {
|
|
11
|
-
constructor() {
|
|
12
|
-
this.name = 'dwc'
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
authenticate(req) {
|
|
16
|
-
let tenant, usr, scopes, attr
|
|
17
|
-
|
|
18
|
-
try {
|
|
19
|
-
tenant = decode(req, 'dwc-tenant')
|
|
20
|
-
usr = decode(req, 'dwc-user', true)
|
|
21
|
-
scopes = decode(req, 'dwc-scopes') || ''
|
|
22
|
-
attr = decode(req, 'dwc-xsuaa-attributes', true) || {}
|
|
23
|
-
} catch (e) {
|
|
24
|
-
LOG._debug && LOG.debug('Error while parsing HTTP headers for DWC authentication:', e)
|
|
25
|
-
return this.fail()
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
if (!tenant || !usr) return this.fail()
|
|
29
|
-
|
|
30
|
-
// make scopes app-local
|
|
31
|
-
const xsappname = decode(req, 'dwc-xsuaa-xsappname') || ''
|
|
32
|
-
scopes = scopes.split(' ').map(s => (s.startsWith(xsappname + '.') ? s.replace(xsappname + '.', '') : s))
|
|
33
|
-
|
|
34
|
-
const user = new cds.User({
|
|
35
|
-
id: usr.logonName,
|
|
36
|
-
tenant,
|
|
37
|
-
_roles: ['any', 'authenticated-user', ...scopes],
|
|
38
|
-
attr: Object.assign(attr, usr)
|
|
39
|
-
})
|
|
40
|
-
|
|
41
|
-
this.success(user)
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
module.exports = DwcStrategy
|
|
@@ -1,56 +0,0 @@
|
|
|
1
|
-
const cds = require('../../../../cds')
|
|
2
|
-
const OData = require('../OData')
|
|
3
|
-
const DEBUG = cds.debug('extensibility')
|
|
4
|
-
|
|
5
|
-
const { alias2ref } = require('../../../../common/utils/csn')
|
|
6
|
-
const { BASE_TENANT } = require('../../../../common/utils/extensibilityUtils')
|
|
7
|
-
|
|
8
|
-
const SYSTEM_SERVICES = ['cds_r.ExtensibilityService', 'cds_r.ModelProviderService']
|
|
9
|
-
|
|
10
|
-
function createOdataService(service) {
|
|
11
|
-
const name = (service.definition && service.definition.name) || service.name
|
|
12
|
-
const edm = cds.compile.to.edm(service.model, { service: name })
|
|
13
|
-
alias2ref(service, edm)
|
|
14
|
-
|
|
15
|
-
const odataService = new OData(edm, service.model, service.options)
|
|
16
|
-
odataService.addCDSServiceToChannel(service)
|
|
17
|
-
|
|
18
|
-
return odataService
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
async function createNewService(name, model, options) {
|
|
22
|
-
const { constructor: Service, path } = cds.services[name]
|
|
23
|
-
const service = new Service(name, model, { ...options }) // cloning options to be safe
|
|
24
|
-
if (service.init) await service.prepend(service.init)
|
|
25
|
-
if (options.impl) await service.prepend(options.impl)
|
|
26
|
-
if (path) service.path = path
|
|
27
|
-
DEBUG &&
|
|
28
|
-
DEBUG('Created tenant-specific service:', service.name, '= new', Service.name, {
|
|
29
|
-
_handlers: {
|
|
30
|
-
on: service._handlers.on.map(h => ({ on: h.on, handler: () => {} }))
|
|
31
|
-
}
|
|
32
|
-
})
|
|
33
|
-
return createOdataService(service)
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
const getModelHash = (tenant, features) => {
|
|
37
|
-
if (!features) features = []
|
|
38
|
-
|
|
39
|
-
let hash
|
|
40
|
-
if (cds.requires.multitenancy && tenant) {
|
|
41
|
-
hash = tenant
|
|
42
|
-
} else {
|
|
43
|
-
hash = BASE_TENANT
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
hash += ':' + features.join(';')
|
|
47
|
-
|
|
48
|
-
return hash
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
module.exports = {
|
|
52
|
-
SYSTEM_SERVICES,
|
|
53
|
-
createOdataService,
|
|
54
|
-
createNewService,
|
|
55
|
-
getModelHash
|
|
56
|
-
}
|