@sap/cds 5.9.7 → 6.0.2
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 +267 -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 +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 +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 +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 +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 +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 +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 +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 +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
|
@@ -1,308 +1 @@
|
|
|
1
|
-
|
|
2
|
-
const path = require('path')
|
|
3
|
-
const BuildTaskHandlerEdmx = require('../buildTaskHandlerEdmx')
|
|
4
|
-
const { getHanaDbModuleDescriptor, getServiceModuleDescriptor } = require('../../mtaUtil')
|
|
5
|
-
const { BuildError } = require('../../util')
|
|
6
|
-
const { BUILD_OPTION_OUTPUT_MODE, OUTPUT_MODE_RESULT_ONLY, ODATA_VERSION, ODATA_VERSION_V2,
|
|
7
|
-
BUILD_TASK_HANA, FOLDER_GEN, BUILD_NODEJS_EDMX_GENERAION, EDMX_GENERATION,
|
|
8
|
-
SKIP_PACKAGE_JSON_GENERATION, SKIP_MANIFEST_GENERATION,
|
|
9
|
-
CONTENT_EDMX, CONTENT_MANIFEST, CONTENT_PACKAGE_JSON, CONTENT_PACKAGELOCK_JSON }
|
|
10
|
-
= require('../../constants')
|
|
11
|
-
const { WARNING } = require('../../buildTaskHandler')
|
|
12
|
-
|
|
13
|
-
const FILE_NAME_MANIFEST_YML = "manifest.yml"
|
|
14
|
-
|
|
15
|
-
class NodeCfModuleBuilder extends BuildTaskHandlerEdmx {
|
|
16
|
-
init() {
|
|
17
|
-
super.init()
|
|
18
|
-
// set unified option values in order to easy access later on
|
|
19
|
-
this.task.options[CONTENT_EDMX] = this.hasBuildOption(CONTENT_EDMX, true) || this.hasCdsEnvOption(BUILD_NODEJS_EDMX_GENERAION, true) || this.hasBuildOption(EDMX_GENERATION, true) ? true : false
|
|
20
|
-
this.task.options[CONTENT_MANIFEST] = !this.hasBuildOption(CONTENT_MANIFEST, false) && !this.hasBuildOption(SKIP_MANIFEST_GENERATION, true) ? true : false
|
|
21
|
-
this.task.options[CONTENT_PACKAGE_JSON] = !this.hasBuildOption(CONTENT_PACKAGE_JSON, false) && !this.hasBuildOption(SKIP_PACKAGE_JSON_GENERATION, true) ? true : false
|
|
22
|
-
this.task.options[CONTENT_PACKAGELOCK_JSON] = !this.hasBuildOption(CONTENT_PACKAGELOCK_JSON, false) ? true : false
|
|
23
|
-
|
|
24
|
-
if (this.task.options.compileDest) {
|
|
25
|
-
throw new BuildError("Option not supported - compileDest")
|
|
26
|
-
}
|
|
27
|
-
// fallback if src has been defined as '.'
|
|
28
|
-
this.destGen = this.isStagingBuild() ? path.resolve(this.task.dest, path.relative(this.buildOptions.root, this.task.src) || this.env.folders.srv) : path.join(this.task.dest, FOLDER_GEN)
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
async build() {
|
|
32
|
-
if (this.env.get(ODATA_VERSION) === ODATA_VERSION_V2) {
|
|
33
|
-
// log warning as nodejs is only supporting odata version V4
|
|
34
|
-
this.pushMessage("OData v2 is not supported by node runtime. Make sure to define OData v2 in cds configuration.", WARNING)
|
|
35
|
-
}
|
|
36
|
-
// by default model contains all features
|
|
37
|
-
const model = await this.model()
|
|
38
|
-
if (!model) {
|
|
39
|
-
return this._result
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
const { dictionary, sources } = await this._compileAll(model)
|
|
43
|
-
|
|
44
|
-
// collect and write language bundles into single i18n.json file
|
|
45
|
-
await this._collectAllLanguageBundles(dictionary, sources, this.destGen)
|
|
46
|
-
|
|
47
|
-
if (this.hasBuildOption(CONTENT_EDMX, true)) {
|
|
48
|
-
await this.compileToEdmx(dictionary.base, this.destGen)
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
if (!this.hasBuildOption(BUILD_OPTION_OUTPUT_MODE, OUTPUT_MODE_RESULT_ONLY)) {
|
|
52
|
-
await this._copyNativeContent(this.task.src, this.isStagingBuild() ? this.destGen : path.dirname(this.destGen))
|
|
53
|
-
|
|
54
|
-
if (this.hasBuildOption(CONTENT_MANIFEST, true)) {
|
|
55
|
-
await Promise.all([this._writeManifestYml(), this._writeCfIgnore()])
|
|
56
|
-
}
|
|
57
|
-
}
|
|
58
|
-
return this._result
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
async clean() {
|
|
62
|
-
// staging build content is deleted by BuildTaskEngine
|
|
63
|
-
if (this.buildOptions.target === this.buildOptions.root) {
|
|
64
|
-
// delete the entire 'task.dest' folder otherwise, for details see #constructor
|
|
65
|
-
// - the value of the folder 'src' has been appended to the origin 'task.dest' dir
|
|
66
|
-
this.logger._debug && this.logger.debug(`Deleting build target folder ${this.destGen}`)
|
|
67
|
-
await fs.remove(this.isStagingBuild() ? this.task.dest : this.destGen)
|
|
68
|
-
}
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
async _copyNativeContent(src, dest) {
|
|
72
|
-
const regex = RegExp('\\.cds$|package\\.json|package-lock\\.json|manifest\\.y.?ml')
|
|
73
|
-
|
|
74
|
-
await super.copyNativeContent(src, dest, (entry) => {
|
|
75
|
-
if (fs.statSync(entry).isDirectory()) {
|
|
76
|
-
return true // using common filter for folders
|
|
77
|
-
}
|
|
78
|
-
return !regex.test(path.basename(entry))
|
|
79
|
-
})
|
|
80
|
-
|
|
81
|
-
// copy relevant content located at project root, e.g. *.js, i18n/*, package.json -> gen/srv
|
|
82
|
-
let packageJsonCopy = false
|
|
83
|
-
let { folders = ['i18n'] } = this.env.i18n
|
|
84
|
-
folders.push('handlers')
|
|
85
|
-
folders = folders.map(folder => path.join(this.buildOptions.root, folder))
|
|
86
|
-
|
|
87
|
-
await super.copyNativeContent(this.buildOptions.root, this.task.dest, (entry) => {
|
|
88
|
-
if (fs.statSync(entry).isDirectory()) {
|
|
89
|
-
return folders.some(folder => entry.startsWith(folder))
|
|
90
|
-
}
|
|
91
|
-
if (/\.js$|\.properties$/.test(entry)) {
|
|
92
|
-
return true
|
|
93
|
-
}
|
|
94
|
-
if (/package\.json$/.test(entry) && this.hasBuildOption(CONTENT_PACKAGE_JSON, true)) {
|
|
95
|
-
packageJsonCopy = true
|
|
96
|
-
return true
|
|
97
|
-
}
|
|
98
|
-
if (/package-lock\.json$/.test(entry) && this.hasBuildOption(CONTENT_PACKAGELOCK_JSON, true)) {
|
|
99
|
-
return true
|
|
100
|
-
}
|
|
101
|
-
return false
|
|
102
|
-
})
|
|
103
|
-
|
|
104
|
-
if (packageJsonCopy) {
|
|
105
|
-
await this._modifyPackageJson(path.join(this.task.dest, 'package.json'))
|
|
106
|
-
}
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
/**
|
|
110
|
-
* Filter file dependencies for CF deployment.<p>
|
|
111
|
-
*
|
|
112
|
-
* On CF, any ../file or file:... dependency is not resolvable anyways, so we can safely filter it out.
|
|
113
|
-
* In CAP samples, we use these to refer to other CDS modules at build time.
|
|
114
|
-
* @param {string} file
|
|
115
|
-
*/
|
|
116
|
-
async _modifyPackageJson(file) {
|
|
117
|
-
function _deleteFileDependencies(deps = {}) {
|
|
118
|
-
let changed = false
|
|
119
|
-
Object.keys(deps).forEach(key => {
|
|
120
|
-
if (typeof deps[key] === 'string' && deps[key].startsWith('.') || deps[key].startsWith('file:')) {
|
|
121
|
-
this.logger.log(`${this.task.for}: removing file dependency '${deps[key]}' from ${path.relative(this.buildOptions.root, file)}`)
|
|
122
|
-
delete deps[key]
|
|
123
|
-
changed = true
|
|
124
|
-
}
|
|
125
|
-
})
|
|
126
|
-
return changed
|
|
127
|
-
}
|
|
128
|
-
function _addEnginesField(content) {
|
|
129
|
-
if (!content.engines || !content.engines.node) {
|
|
130
|
-
const { engines } = require('../../../../package.json')
|
|
131
|
-
if (engines && engines.node) {
|
|
132
|
-
this.logger.log(`${this.task.for}: adding node engines version to package.json ${engines.node}`)
|
|
133
|
-
content.engines = content.engines || {}
|
|
134
|
-
content.engines.node = engines.node
|
|
135
|
-
return true
|
|
136
|
-
}
|
|
137
|
-
}
|
|
138
|
-
return false
|
|
139
|
-
}
|
|
140
|
-
|
|
141
|
-
let content = await fs.readFile(file)
|
|
142
|
-
let changed = false
|
|
143
|
-
if (content) {
|
|
144
|
-
content = JSON.parse(content)
|
|
145
|
-
changed |= _deleteFileDependencies.call(this, content.dependencies)
|
|
146
|
-
changed |= _deleteFileDependencies.call(this, content.devDependencies)
|
|
147
|
-
changed |= _addEnginesField.call(this, content)
|
|
148
|
-
}
|
|
149
|
-
if (changed) {
|
|
150
|
-
await this.write(content).to(file)
|
|
151
|
-
}
|
|
152
|
-
}
|
|
153
|
-
|
|
154
|
-
// this is to have a dev fast-turnaround
|
|
155
|
-
async _writeCfIgnore() {
|
|
156
|
-
if (this.isStagingBuild()) {
|
|
157
|
-
const content = `node_modules/\n`
|
|
158
|
-
await this.write(content).to('.cfignore')
|
|
159
|
-
}
|
|
160
|
-
}
|
|
161
|
-
|
|
162
|
-
async _writeManifestYml() {
|
|
163
|
-
if (!this.isStagingBuild()) {
|
|
164
|
-
return
|
|
165
|
-
}
|
|
166
|
-
|
|
167
|
-
let manifest = path.join(this.task.src, FILE_NAME_MANIFEST_YML)
|
|
168
|
-
if (await fs.pathExists(manifest)) {
|
|
169
|
-
// copy existing manifest to service root folder in staging area
|
|
170
|
-
await this.copy(manifest).to(FILE_NAME_MANIFEST_YML)
|
|
171
|
-
return
|
|
172
|
-
}
|
|
173
|
-
manifest = path.join(this.task.src, 'manifest.yml')
|
|
174
|
-
if (await fs.pathExists(manifest)) {
|
|
175
|
-
// copy existing manifest to service root folder in staging area
|
|
176
|
-
await this.copy(manifest).to('manifest.yml')
|
|
177
|
-
return
|
|
178
|
-
}
|
|
179
|
-
|
|
180
|
-
// generate one...
|
|
181
|
-
// check whether a hdi service binding is required
|
|
182
|
-
const hanaBuildTask = this.buildOptions.tasks.find(task => task.for === BUILD_TASK_HANA)
|
|
183
|
-
let hanaServiceBinding = ""
|
|
184
|
-
|
|
185
|
-
if (hanaBuildTask) {
|
|
186
|
-
const dbModuleDescriptor = await getHanaDbModuleDescriptor(this.buildOptions.root, path.basename(hanaBuildTask.src), this.logger)
|
|
187
|
-
hanaServiceBinding = ` - ${dbModuleDescriptor.hdiServiceName}`
|
|
188
|
-
} else {
|
|
189
|
-
this.logger.debug("generating manifest.yml without HANA service binding, using sqlite database")
|
|
190
|
-
}
|
|
191
|
-
|
|
192
|
-
try {
|
|
193
|
-
const srvModuleDescriptor = await getServiceModuleDescriptor(this.buildOptions.root, path.basename(this.task.src), "nodejs", this.logger)
|
|
194
|
-
const MANIFEST_YML_CONTENT = `---
|
|
195
|
-
applications:
|
|
196
|
-
- name: ${srvModuleDescriptor.appName}
|
|
197
|
-
path: .
|
|
198
|
-
memory: 256M
|
|
199
|
-
buildpacks:
|
|
200
|
-
- nodejs_buildpack
|
|
201
|
-
services:
|
|
202
|
-
${hanaServiceBinding}`
|
|
203
|
-
|
|
204
|
-
await this.write(MANIFEST_YML_CONTENT).to(FILE_NAME_MANIFEST_YML)
|
|
205
|
-
} catch (e) {
|
|
206
|
-
if (e.name === 'YAMLSyntaxError') {
|
|
207
|
-
this.logger.error("Failed to parse [mta.yaml]")
|
|
208
|
-
}
|
|
209
|
-
this.logger.error(e)
|
|
210
|
-
}
|
|
211
|
-
}
|
|
212
|
-
|
|
213
|
-
async _compileAll(csn) {
|
|
214
|
-
const sources = await this._resolveSourcePaths(csn)
|
|
215
|
-
const dictionary = { base: null, features: null }
|
|
216
|
-
|
|
217
|
-
if (sources.features) {
|
|
218
|
-
// create base model
|
|
219
|
-
dictionary.base = await this.cds.load(sources.base, this.options())
|
|
220
|
-
dictionary.features = await this._compileFeatures(dictionary.base, sources.features)
|
|
221
|
-
} else {
|
|
222
|
-
// model already represents the base model as no feature toggles exist
|
|
223
|
-
dictionary.base = csn
|
|
224
|
-
}
|
|
225
|
-
// adding csn to build result containing @source and _where persisted properties
|
|
226
|
-
await this.compileToJson(dictionary.base, this.destGen)
|
|
227
|
-
|
|
228
|
-
return { dictionary, sources }
|
|
229
|
-
}
|
|
230
|
-
|
|
231
|
-
async _collectAllLanguageBundles(dictionary, paths, dest) {
|
|
232
|
-
// create language bundle for base model
|
|
233
|
-
await this.collectLanguageBundles(dictionary.base, dest)
|
|
234
|
-
if (dictionary.features) {
|
|
235
|
-
const fts = path.dirname(this.env.features.folders)
|
|
236
|
-
// create language bundles for all features
|
|
237
|
-
for (const ftName in dictionary.features) {
|
|
238
|
-
// attach the sources information for i18n location reference
|
|
239
|
-
dictionary.features[ftName]['$sources'] = paths.features[ftName]
|
|
240
|
-
await this.collectLanguageBundles(dictionary.features[ftName], path.join(dest, fts, ftName), false)
|
|
241
|
-
}
|
|
242
|
-
}
|
|
243
|
-
}
|
|
244
|
-
|
|
245
|
-
async _resolveSourcePaths(csn) {
|
|
246
|
-
const fts = this.env.features.folders ? path.dirname(this.env.features.folders) : undefined
|
|
247
|
-
const regex = new RegExp(path.resolve(this.buildOptions.root, fts || 'fts').replace(/\\/g, '\\\\') + '[/|\\\\](?<ftName>[^/|\\\\]*)')
|
|
248
|
-
let paths = { base: [] }
|
|
249
|
-
|
|
250
|
-
// add ROOT source file paths for the base model
|
|
251
|
-
paths.base = this._resolveModel().reduce((acc, file) => {
|
|
252
|
-
const match = file.match(regex)
|
|
253
|
-
if (!match) {
|
|
254
|
-
acc.push(file)
|
|
255
|
-
}
|
|
256
|
-
return acc
|
|
257
|
-
}, [])
|
|
258
|
-
|
|
259
|
-
// check whether feature toggles are used by this project
|
|
260
|
-
if (!fts || !await fs.pathExists(path.join(this.buildOptions.root, fts))) {
|
|
261
|
-
return paths
|
|
262
|
-
}
|
|
263
|
-
|
|
264
|
-
// add source file paths for the features
|
|
265
|
-
paths.features = csn['$sources'].reduce((acc, file) => {
|
|
266
|
-
const match = file.match(regex)
|
|
267
|
-
if (match) {
|
|
268
|
-
const { ftName } = match.groups
|
|
269
|
-
//feature
|
|
270
|
-
if (!acc[ftName]) {
|
|
271
|
-
acc[ftName] = []
|
|
272
|
-
}
|
|
273
|
-
acc[ftName].push(file)
|
|
274
|
-
}
|
|
275
|
-
return acc
|
|
276
|
-
}, {})
|
|
277
|
-
|
|
278
|
-
return paths
|
|
279
|
-
}
|
|
280
|
-
|
|
281
|
-
async _compileFeatures(baseCsn, ftsPaths) {
|
|
282
|
-
if (!ftsPaths) {
|
|
283
|
-
return
|
|
284
|
-
}
|
|
285
|
-
const features = {}
|
|
286
|
-
const fts = path.dirname(this.env.features.folders)
|
|
287
|
-
const options = { ...this.options(), ...{ flavor: 'parsed' } }
|
|
288
|
-
// create feature models
|
|
289
|
-
for (const ftName in ftsPaths) {
|
|
290
|
-
const parsedCsn = await this.cds.load(ftsPaths[ftName], options)
|
|
291
|
-
// delete any requires references
|
|
292
|
-
if (parsedCsn.requires) {
|
|
293
|
-
delete parsedCsn.requires
|
|
294
|
-
}
|
|
295
|
-
await this.compileToJson(parsedCsn, path.join(this.destGen, fts, ftName), false)
|
|
296
|
-
this._validateFeature(baseCsn, parsedCsn)
|
|
297
|
-
features[ftName] = parsedCsn
|
|
298
|
-
}
|
|
299
|
-
return features
|
|
300
|
-
}
|
|
301
|
-
|
|
302
|
-
_validateFeature(baseCsn, parsedCsn) {
|
|
303
|
-
// features must not contain any other dependencies than base model
|
|
304
|
-
require('@sap/cds-compiler').compileSources({ 'base.csn': baseCsn, 'parsed.csn': parsedCsn }, this.options())
|
|
305
|
-
}
|
|
306
|
-
}
|
|
307
|
-
|
|
308
|
-
module.exports = NodeCfModuleBuilder
|
|
1
|
+
module.exports = require('../nodejs')
|
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
const fs = require('fs')
|
|
2
|
+
const path = require('path')
|
|
3
|
+
const BuildTaskHandlerEdmx = require('../buildTaskHandlerEdmx')
|
|
4
|
+
const { BuildError } = require('../../util')
|
|
5
|
+
const { BUILD_OPTION_OUTPUT_MODE, OUTPUT_MODE_RESULT_ONLY, ODATA_VERSION, ODATA_VERSION_V2, FOLDER_GEN, BUILD_NODEJS_EDMX_GENERAION, EDMX_GENERATION,
|
|
6
|
+
SKIP_PACKAGE_JSON_GENERATION, CONTENT_EDMX, CONTENT_PACKAGE_JSON, CONTENT_PACKAGELOCK_JSON, CONTENT_NPMRC, CONTENT_CDSRC_JSON, CONTENT_ENV, CONTENT_DEFAULT_ENV_JSON } = require('../../constants')
|
|
7
|
+
const { WARNING } = require('../../buildTaskHandler')
|
|
8
|
+
|
|
9
|
+
class NodeCfModuleBuilder extends BuildTaskHandlerEdmx {
|
|
10
|
+
init() {
|
|
11
|
+
super.init()
|
|
12
|
+
// set unified option values in order to ease access later on
|
|
13
|
+
// default value true
|
|
14
|
+
this.task.options[CONTENT_PACKAGE_JSON] = !this.hasBuildOption(CONTENT_PACKAGE_JSON, false) && !this.hasBuildOption(SKIP_PACKAGE_JSON_GENERATION, true) ? true : false
|
|
15
|
+
this.task.options[CONTENT_PACKAGELOCK_JSON] = !this.hasBuildOption(CONTENT_PACKAGELOCK_JSON, false) ? true : false
|
|
16
|
+
this.task.options[CONTENT_NPMRC] = !this.hasBuildOption(CONTENT_NPMRC, false) ? true : false
|
|
17
|
+
this.task.options[CONTENT_CDSRC_JSON] = !this.hasBuildOption(CONTENT_CDSRC_JSON, false) ? true : false
|
|
18
|
+
|
|
19
|
+
// default value false
|
|
20
|
+
this.task.options[CONTENT_EDMX] = this.hasBuildOption(CONTENT_EDMX, true) || this.hasCdsEnvOption(BUILD_NODEJS_EDMX_GENERAION, true) || this.hasBuildOption(EDMX_GENERATION, true) ? true : false
|
|
21
|
+
this.task.options[CONTENT_ENV] = this.hasBuildOption(CONTENT_ENV, true) ? true : false
|
|
22
|
+
this.task.options[CONTENT_DEFAULT_ENV_JSON] = this.hasBuildOption(CONTENT_DEFAULT_ENV_JSON, true) ? true : false
|
|
23
|
+
|
|
24
|
+
if (this.task.options.compileDest) {
|
|
25
|
+
throw new BuildError("Option not supported - compileDest")
|
|
26
|
+
}
|
|
27
|
+
// fallback if src has been defined as '.'
|
|
28
|
+
this.destSrv = this.isStagingBuild() ? path.resolve(this.task.dest, this.env.folders.srv) : path.join(this.task.dest, FOLDER_GEN)
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
async build() {
|
|
32
|
+
const destSrv = this.isStagingBuild() ? this.destSrv : path.resolve(this.destSrv, this.env.folders.srv)
|
|
33
|
+
const destRoot = this.isStagingBuild() ? this.task.dest : this.destSrv
|
|
34
|
+
|
|
35
|
+
if (this.env.get(ODATA_VERSION) === ODATA_VERSION_V2) {
|
|
36
|
+
// log warning as nodejs is only supporting odata version V4
|
|
37
|
+
this.pushMessage("OData v2 is not supported by node runtime. Make sure to define OData v2 in cds configuration.", WARNING)
|
|
38
|
+
}
|
|
39
|
+
// by default model contains all features
|
|
40
|
+
const model = await this.model()
|
|
41
|
+
if (!model) {
|
|
42
|
+
return this._result
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
const { dictionary, sources } = await this.compileAll(model, destSrv, destRoot)
|
|
46
|
+
|
|
47
|
+
// collect and write language bundles into single i18n.json file
|
|
48
|
+
await this.collectAllLanguageBundles(dictionary, sources, destSrv, destRoot)
|
|
49
|
+
|
|
50
|
+
if (this.hasBuildOption(CONTENT_EDMX, true)) {
|
|
51
|
+
await this.compileToEdmx(dictionary.base, this.destSrv)
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
if (!this.hasBuildOption(BUILD_OPTION_OUTPUT_MODE, OUTPUT_MODE_RESULT_ONLY)) {
|
|
55
|
+
const srcSrv = this.task.src === this.buildOptions.root ? path.resolve(this.task.src, this.env.folders.srv) : this.task.src
|
|
56
|
+
await this._copyNativeContent(this.buildOptions.root, srcSrv, destRoot, destSrv)
|
|
57
|
+
}
|
|
58
|
+
return this._result
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
async clean() {
|
|
62
|
+
// staging build content is deleted by BuildTaskEngine
|
|
63
|
+
if (this.buildOptions.target === this.buildOptions.root) {
|
|
64
|
+
// delete the entire 'task.dest' folder otherwise, for details see #constructor
|
|
65
|
+
// - the value of the folder 'src' has been appended to the origin 'task.dest' dir
|
|
66
|
+
this.logger._debug && this.logger.debug(`Deleting build target folder ${this.destSrv}`)
|
|
67
|
+
await fs.promises.rm(this.isStagingBuild() ? this.task.dest : this.destSrv, { force: true, recursive: true })
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
async _copyNativeContent(srcRoot, srcSrv, destRoot, destSrv) {
|
|
72
|
+
// project/srv/** -> 'gen/srv/srv/**'
|
|
73
|
+
const filesFilter = await this._copySrvContent(srcSrv, destRoot, destSrv)
|
|
74
|
+
|
|
75
|
+
// project/* -> 'gen/srv/*'
|
|
76
|
+
await this._copyProjectRootContent(srcRoot, destRoot, (entry) => !filesFilter.includes(path.basename(entry)))
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
/**
|
|
80
|
+
* Copy files from the given <em>src</em>' folder (e.g. 'project/srv') to either <em>destRoot</em> (e.g. 'project/gen/srv')
|
|
81
|
+
* or <em>destSrv</em> (e.g. 'project/gen/srv/srv') folders according to the file semantics.
|
|
82
|
+
* Files with project semantics like 'package.json' or '.npmrc' file are copied to <em>destRoot</em> while others like '.js' service handlers
|
|
83
|
+
* are copied to <em>destSrv</em>.
|
|
84
|
+
* @param {*} src
|
|
85
|
+
* @param {*} destRoot - folder name representing the app root folder (e.g. gen/srv)
|
|
86
|
+
* @param {*} destSrv - folder name representing the app sub-folder (e.g. gen/srv/srv)
|
|
87
|
+
* @returns the list of files that have been copied
|
|
88
|
+
*/
|
|
89
|
+
async _copySrvContent(src, destRoot, destSrv) {
|
|
90
|
+
const srvRootBlockList = RegExp('package\\.json$|package-lock\\.json$|\\.npmrc$|\\.cdsrc\\.json$')
|
|
91
|
+
const srvBlockList = RegExp('\\.cds$|csn\\.json$|\\.csn$|manifest\\.y.?ml$|\\.env($|\\..*$)|default-env\\.json$')
|
|
92
|
+
const srvRootFileNames = []
|
|
93
|
+
|
|
94
|
+
// 1. copy all files to 'destSrv' except those contained in the blocklist (including node_modules)
|
|
95
|
+
// project/srv -> 'gen/srv/srv'
|
|
96
|
+
await super.copyNativeContent(src, destSrv, (entry) => {
|
|
97
|
+
if (fs.statSync(entry).isDirectory()) {
|
|
98
|
+
// TODO shall not copy language bundles - return !/(\/|\\)(node_modules|_i18n)(\/|\\)?$/.test(entry)
|
|
99
|
+
return !/(\/|\\)node_modules(\/|\\)?$/.test(entry)
|
|
100
|
+
}
|
|
101
|
+
if (srvRootBlockList.test(entry)) {
|
|
102
|
+
srvRootFileNames.push(path.basename(entry))
|
|
103
|
+
return false
|
|
104
|
+
}
|
|
105
|
+
return !srvBlockList.test(entry)
|
|
106
|
+
})
|
|
107
|
+
|
|
108
|
+
// 2. copy dedicated files like package.json, .npmrc to 'destRoot'
|
|
109
|
+
// project/srv -> 'gen/srv'
|
|
110
|
+
let srvAllowList = "package\\.json$" // always copy package.json, modify only if CONTENT_PACKAGE_JSON is true
|
|
111
|
+
srvAllowList += this.hasBuildOption(CONTENT_PACKAGELOCK_JSON, true) ? "|package-lock\\.json$" : ""
|
|
112
|
+
srvAllowList += this.hasBuildOption(CONTENT_NPMRC, true) ? "|\\.npmrc$" : ""
|
|
113
|
+
srvAllowList += this.hasBuildOption(CONTENT_CDSRC_JSON, true) ? "|\\.cdsrc\\.json$" : ""
|
|
114
|
+
srvAllowList += this.hasBuildOption(CONTENT_ENV, true) ? "|\\.env($|\\..*$)" : ""
|
|
115
|
+
srvAllowList += this.hasBuildOption(CONTENT_DEFAULT_ENV_JSON, true) ? "|default-env\\.json$" : ""
|
|
116
|
+
srvAllowList = new RegExp(srvAllowList)
|
|
117
|
+
await Promise.all(srvRootFileNames.map(fileName => {
|
|
118
|
+
if (srvAllowList.test(fileName)) {
|
|
119
|
+
return this.copy(path.join(src, fileName)).to(path.join(destRoot, fileName))
|
|
120
|
+
}
|
|
121
|
+
}))
|
|
122
|
+
return srvRootFileNames
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
/**
|
|
126
|
+
* Copy dedicated files (files with project semantics like package.json, .npmrc, .cdsrc, etc.)
|
|
127
|
+
* from the given <em>src</em> folder (e.g. 'project') into the given <em>dest</em> folder (e.g. 'project/gen/srv')
|
|
128
|
+
* @param {*} src
|
|
129
|
+
* @param {*} dest
|
|
130
|
+
* @param {*} filter - copy file if filter function returns true
|
|
131
|
+
*/
|
|
132
|
+
async _copyProjectRootContent(src, dest, filter) {
|
|
133
|
+
let { folders = ['i18n'] } = this.env.i18n
|
|
134
|
+
folders.push('handlers')
|
|
135
|
+
folders = folders.map(folder => path.join(src, folder))
|
|
136
|
+
let srvAllowList = "package\\.json$" // always copy package.json, modify only if CONTENT_PACKAGE_JSON is true
|
|
137
|
+
srvAllowList += this.hasBuildOption(CONTENT_PACKAGELOCK_JSON, true) ? "|package-lock\\.json$" : ""
|
|
138
|
+
srvAllowList += this.hasBuildOption(CONTENT_NPMRC, true) ? "|\\.npmrc$" : ""
|
|
139
|
+
srvAllowList += this.hasBuildOption(CONTENT_CDSRC_JSON, true) ? "|\\.cdsrc\\.json$" : ""
|
|
140
|
+
srvAllowList += this.hasBuildOption(CONTENT_ENV, true) ? "|\\.env($|\\..*$)" : ""
|
|
141
|
+
srvAllowList += this.hasBuildOption(CONTENT_DEFAULT_ENV_JSON, true) ? "|default-env\\.json$" : ""
|
|
142
|
+
srvAllowList = new RegExp(srvAllowList)
|
|
143
|
+
|
|
144
|
+
await super.copyNativeContent(src, dest, (entry) => {
|
|
145
|
+
if (fs.statSync(entry).isDirectory()) {
|
|
146
|
+
return folders.some(folder => entry.startsWith(folder))
|
|
147
|
+
}
|
|
148
|
+
if (/\.js$|\.properties$/.test(entry)) {
|
|
149
|
+
return true
|
|
150
|
+
}
|
|
151
|
+
return srvAllowList.test(entry) && (!filter || filter.call(this, entry))
|
|
152
|
+
})
|
|
153
|
+
|
|
154
|
+
if (this.hasBuildOption(CONTENT_PACKAGE_JSON, true) && fs.existsSync(path.join(dest, 'package.json'))) {
|
|
155
|
+
await this._modifyPackageJson(path.join(dest, 'package.json'))
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
/**
|
|
160
|
+
* Modify package.json file defined by the given file path.
|
|
161
|
+
* @param {string} file
|
|
162
|
+
*/
|
|
163
|
+
async _modifyPackageJson(file) {
|
|
164
|
+
function _addEnginesField(content) {
|
|
165
|
+
if (!content.engines || !content.engines.node) {
|
|
166
|
+
const { engines } = require('../../../../package.json')
|
|
167
|
+
if (engines && engines.node) {
|
|
168
|
+
this.logger.log(`${this.task.for}: adding node engines version to package.json ${engines.node}`)
|
|
169
|
+
content.engines = content.engines || {}
|
|
170
|
+
content.engines.node = engines.node
|
|
171
|
+
return true
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
return false
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
let content = await fs.promises.readFile(file)
|
|
178
|
+
let changed = false
|
|
179
|
+
if (content) {
|
|
180
|
+
content = JSON.parse(content)
|
|
181
|
+
changed |= _addEnginesField.call(this, content)
|
|
182
|
+
}
|
|
183
|
+
if (changed) {
|
|
184
|
+
await this.write(content).to(file)
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
module.exports = NodeCfModuleBuilder
|
package/bin/build/util.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
const
|
|
1
|
+
const fs = require('fs')
|
|
2
2
|
const path = require('path')
|
|
3
3
|
const { SEVERITY_ERROR } = require('./constants')
|
|
4
4
|
|
|
@@ -84,36 +84,13 @@ async function isOldJavaStack(dirs) {
|
|
|
84
84
|
const files = readPomFilePaths(dirs)
|
|
85
85
|
if (files.length > 0) {
|
|
86
86
|
return (await Promise.all(files.map(async file => {
|
|
87
|
-
const content = await fs.readFile(file, 'utf-8')
|
|
87
|
+
const content = await fs.promises.readFile(file, 'utf-8')
|
|
88
88
|
return content && /<groupId>\s*com\.sap\.cloud\.servicesdk/.test(content) && !(/<groupId>\s*com\.sap\.cds\s*<\/groupId>/.test(content) && /<artifactId>\s*cds-/.test(content))
|
|
89
89
|
}))).some(result => result)
|
|
90
90
|
}
|
|
91
91
|
return false
|
|
92
92
|
}
|
|
93
93
|
|
|
94
|
-
/**
|
|
95
|
-
* Returns a promise that resolves after all of the given promises have either resolved or rejected,
|
|
96
|
-
* with an array of objects that each describes the outcome of each promise.
|
|
97
|
-
*
|
|
98
|
-
* @param {*} promises An iterable object, such as an Array, in which each member is a Promise.
|
|
99
|
-
* @returns A pending Promise that will be asynchronously fulfilled once every promise in the specified
|
|
100
|
-
* collection of promises has completed, either by successfully being fulfilled or by being rejected.
|
|
101
|
-
* At that time, the returned promise's handler is passed as input an array containing the outcome of
|
|
102
|
-
* each promise in the original set of promises.<br>
|
|
103
|
-
* For each outcome object, a status string is present. If the status is fulfilled, then a value is present.
|
|
104
|
-
* If the status is rejected, then a reason is present. The value (or reason) reflects what value each
|
|
105
|
-
* promise was fulfilled (or rejected) with.
|
|
106
|
-
*/
|
|
107
|
-
function allSettled(promises) {
|
|
108
|
-
let wrappedPromises = Array.from(promises).map(p =>
|
|
109
|
-
Promise.resolve(p).then(
|
|
110
|
-
val => ({ state: 'fulfilled', value: val }),
|
|
111
|
-
err => ({ state: 'rejected', reason: err })
|
|
112
|
-
)
|
|
113
|
-
);
|
|
114
|
-
return Promise.all(wrappedPromises);
|
|
115
|
-
}
|
|
116
|
-
|
|
117
94
|
function redactCredentials(config, o) {
|
|
118
95
|
return JSON.stringify(config, (k, v) => {
|
|
119
96
|
if (!v) {
|
|
@@ -128,10 +105,6 @@ function redactCredentials(config, o) {
|
|
|
128
105
|
}, o && o.indents || 2)
|
|
129
106
|
}
|
|
130
107
|
|
|
131
|
-
function isAbsolutePath(pathName) {
|
|
132
|
-
return /^(?:\/|[a-z]+:\/\/)/.test(pathName)
|
|
133
|
-
}
|
|
134
|
-
|
|
135
108
|
/** redacts password-like strings, also reducing clutter in output */
|
|
136
109
|
function _redacted(cred) {
|
|
137
110
|
const secrets = /(password)|(certificate)|(ca)/i // 'certificate' and 'ca' on HANA
|
|
@@ -142,6 +115,22 @@ function _redacted(cred) {
|
|
|
142
115
|
return newCred
|
|
143
116
|
}
|
|
144
117
|
|
|
118
|
+
/**
|
|
119
|
+
* Distinguishes whether the project uses the new ModelProviderService based approach as
|
|
120
|
+
* defined by the new Streamlined MTX (cds >=6) or whether it represents an old MTX project
|
|
121
|
+
* using the cds-mtx library.
|
|
122
|
+
*
|
|
123
|
+
* @param {object} env
|
|
124
|
+
* @returns
|
|
125
|
+
*/
|
|
126
|
+
function isStreamlinedMtx(cds) {
|
|
127
|
+
if (process.env.OLD_MTX) return false
|
|
128
|
+
return !cds.mtx && (cds.env.get("requires.toggles") !== undefined
|
|
129
|
+
|| cds.env.requires['cds.xt.ModelProviderService']
|
|
130
|
+
|| cds.env.get("requires.multitenancy.streamlined") === true
|
|
131
|
+
|| (typeof cds.env.get("requires.multitenancy") === "object" && cds.env.get("requires.multitenancy.streamlined") === undefined))
|
|
132
|
+
}
|
|
133
|
+
|
|
145
134
|
class BuildMessage extends Error {
|
|
146
135
|
constructor(message, severity) {
|
|
147
136
|
super(message)
|
|
@@ -175,11 +164,10 @@ module.exports = {
|
|
|
175
164
|
setProperty,
|
|
176
165
|
hasJavaNature,
|
|
177
166
|
isOldJavaStack,
|
|
178
|
-
allSettled,
|
|
179
167
|
redactCredentials,
|
|
180
168
|
hasOptionValue,
|
|
181
169
|
relativePaths,
|
|
182
|
-
|
|
170
|
+
isStreamlinedMtx,
|
|
183
171
|
BuildMessage,
|
|
184
172
|
BuildError
|
|
185
173
|
}
|
package/bin/cds.js
CHANGED
|
@@ -16,11 +16,13 @@ const cli = { //NOSONAR
|
|
|
16
16
|
if (process.env.NODE_ENV !== 'test') this.errorHandlers()
|
|
17
17
|
if (cmd in this.Shortcuts) cmd = process.argv[2] = this.Shortcuts[cmd]
|
|
18
18
|
let task = this.load ('./'+cmd)
|
|
19
|
-
if (task) return task.apply (this, this.args(task,argv))
|
|
19
|
+
if (task && cmd !== 'build') return task.apply (this, this.args(task,argv))
|
|
20
20
|
|
|
21
|
-
// delegate to cds-dk for rest of commands (usually shortcuts like `cds c`)
|
|
21
|
+
// delegate to cds-dk for rest of commands (usually shortcuts like `cds c` including cds build if cds-dk is available)
|
|
22
22
|
const dk = _requireDk('cds')
|
|
23
|
-
|
|
23
|
+
if (dk) return dk.exec(cmd, ...argv)
|
|
24
|
+
if (cmd === 'build') return task.apply (this, this.args(task,argv))
|
|
25
|
+
_die_needsDk (cmd)
|
|
24
26
|
},
|
|
25
27
|
|
|
26
28
|
load (cmd) {
|
|
@@ -1,4 +1,7 @@
|
|
|
1
1
|
const cp = require('child_process');
|
|
2
|
+
const fsp = require('fs').promises;
|
|
3
|
+
const os = require('os');
|
|
4
|
+
const path = require('path');
|
|
2
5
|
|
|
3
6
|
const cds = require('../../../lib');
|
|
4
7
|
const LOG = cds.log ? cds.log('deploy') : console;
|
|
@@ -27,6 +30,7 @@ class CfUtil {
|
|
|
27
30
|
async _cfRun(...args) {
|
|
28
31
|
const cmdLine = `${CF_COMMAND} ${args.join(' ')}`;
|
|
29
32
|
if (DEBUG) {
|
|
33
|
+
// eslint-disable-next-line no-console
|
|
30
34
|
console.time(cmdLine);
|
|
31
35
|
LOG.debug('>>> ' + cmdLine);
|
|
32
36
|
}
|
|
@@ -65,6 +69,7 @@ class CfUtil {
|
|
|
65
69
|
});
|
|
66
70
|
});
|
|
67
71
|
} finally {
|
|
72
|
+
// eslint-disable-next-line no-console
|
|
68
73
|
DEBUG && console.timeEnd(cmdLine);
|
|
69
74
|
}
|
|
70
75
|
}
|
|
@@ -100,22 +105,42 @@ class CfUtil {
|
|
|
100
105
|
return match[1];
|
|
101
106
|
}
|
|
102
107
|
|
|
108
|
+
async getCfTargetFromConfigFile() {
|
|
109
|
+
const cfHome = process.env.CF_HOME || process.env.cf_home || path.join(os.homedir(), '.cf');
|
|
110
|
+
try {
|
|
111
|
+
const fileContent = await fsp.readFile(path.join(cfHome, 'config.json'));
|
|
112
|
+
const config = JSON.parse(fileContent);
|
|
113
|
+
if (config) {
|
|
114
|
+
return {
|
|
115
|
+
apiEndpoint: this._extract(config.Target, /\s*(.+)\s*/, `CF API endpoint is missing. Use 'cf login' to login.`),
|
|
116
|
+
org: this._extract(config.OrganizationFields.Name, /\s*(.+)\s*/, `CF org is missing. Use 'cf target -o <ORG> to specify.`),
|
|
117
|
+
space: this._extract(config.SpaceFields.Name, /\s*(.+)\s*/, `CF space is missing. Use 'cf target -s <SPACE>' to specify.`)
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
} catch (err) {
|
|
121
|
+
LOG.debug(`getCfTargetFromConfigFile: ${err}`);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
|
|
103
125
|
async getCfTargetFromCli() {
|
|
104
126
|
const result = await this._cfRun('target');
|
|
105
|
-
|
|
106
127
|
return {
|
|
107
|
-
apiEndpoint: this._extract(result, /api endpoint\s*:\s*(
|
|
108
|
-
user: this._extract(result, /user\s*:\s*(
|
|
109
|
-
org: this._extract(result, /org\s*:\s*(
|
|
110
|
-
space: this._extract(result, /space\s*:\s*(
|
|
128
|
+
apiEndpoint: this._extract(result, /api endpoint\s*:\s*(.+)/i, `CF API endpoint is missing. Use 'cf login' to login.`),
|
|
129
|
+
user: this._extract(result, /user\s*:\s*(.+)/i, `CF user is missing. Use 'cf login' to login.`),
|
|
130
|
+
org: this._extract(result, /org\s*:\s*(.+)/i, `CF org is missing. Use 'cf target -o <ORG> to specify.`),
|
|
131
|
+
space: this._extract(result, /space\s*:\s*(.+)/i, `CF space is missing. Use 'cf target -s <SPACE>' to specify.`),
|
|
111
132
|
};
|
|
112
133
|
}
|
|
113
134
|
|
|
135
|
+
async getCfTarget() {
|
|
136
|
+
return await this.getCfTargetFromConfigFile() || await this.getCfTargetFromCli();
|
|
137
|
+
}
|
|
138
|
+
|
|
114
139
|
async getCfSpaceInfo() {
|
|
115
140
|
if (!this.spaceInfo) {
|
|
116
141
|
DEBUG && LOG.debug('getting space info');
|
|
117
142
|
|
|
118
|
-
const target = await this.
|
|
143
|
+
const target = await this.getCfTarget();
|
|
119
144
|
|
|
120
145
|
const { org, space } = target;
|
|
121
146
|
const orgs = await this._cfRequest(`/v3/organizations`, { names: org });
|