@sap/cds 5.9.8 → 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 +252 -20
- package/apis/services.d.ts +1 -1
- package/app/fiori/preview.js +2 -6
- package/app/index.js +3 -3
- package/bin/build/buildTaskEngine.js +17 -15
- package/bin/build/buildTaskFactory.js +29 -19
- package/bin/build/buildTaskHandler.js +27 -11
- package/bin/build/buildTaskProvider.js +2 -4
- package/bin/build/buildTaskProviderFactory.js +11 -16
- package/bin/build/constants.js +14 -6
- package/bin/build/csv-reader.js +2 -1
- package/bin/build/index.js +12 -18
- package/bin/build/provider/buildTaskHandlerEdmx.js +3 -39
- package/bin/build/provider/buildTaskHandlerFeatureToggles.js +149 -0
- package/bin/build/provider/buildTaskHandlerInternal.js +2 -3
- package/bin/build/provider/buildTaskProviderInternal.js +108 -239
- package/bin/build/provider/fiori/index.js +2 -2
- package/bin/build/provider/hana/2migration.js +11 -11
- package/bin/build/provider/hana/2tabledata.js +3 -3
- package/bin/build/provider/hana/index.js +89 -99
- package/bin/build/provider/hana/migrationtable.js +4 -3
- package/bin/build/provider/java/index.js +101 -0
- package/bin/build/provider/java-cf/index.js +1 -101
- package/bin/build/provider/mtx/index.js +83 -41
- package/bin/build/provider/mtx/resourcesTarBuilder.js +68 -0
- package/bin/build/provider/mtx-sidecar/index.js +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 +4 -3
- package/common.cds +61 -16
- package/lib/compile/cdsc.js +3 -2
- package/lib/compile/etc/_localized.js +15 -14
- package/lib/compile/for/drafts.js +3 -4
- package/lib/compile/for/java.js +13 -10
- package/lib/compile/for/nodejs.js +8 -8
- package/lib/compile/for/odata.js +7 -12
- package/lib/compile/for/sql.js +5 -6
- package/lib/compile/index.js +5 -4
- package/lib/compile/load.js +9 -11
- package/lib/compile/minify.js +8 -5
- package/lib/compile/parse.js +4 -2
- package/lib/compile/resolve.js +18 -15
- package/lib/compile/to/edm.js +0 -1
- package/lib/compile/to/gql.js +3 -2
- package/lib/compile/to/json.js +24 -17
- package/lib/connect/bindings.js +3 -2
- package/lib/connect/index.js +5 -5
- package/lib/core/classes.js +74 -2
- package/lib/core/entities.js +52 -3
- package/lib/core/reflect.js +2 -1
- package/lib/deploy.js +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 +127 -41
- 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,8 +1,8 @@
|
|
|
1
1
|
const path = require('path')
|
|
2
|
-
const
|
|
2
|
+
const fs = require('fs').promises
|
|
3
3
|
|
|
4
4
|
const { BUILD_OPTION_OUTPUT_MODE, OUTPUT_MODE_DEFAULT, OUTPUT_MODE_RESULT_ONLY, SEVERITY_INFO, SEVERITY_WARNING, SEVERITY_ERROR, OVERRIDE_METHOD_MSG } = require('./constants')
|
|
5
|
-
const { hasOptionValue, getProperty, relativePaths,
|
|
5
|
+
const { hasOptionValue, getProperty, relativePaths, BuildMessage } = require('./util')
|
|
6
6
|
|
|
7
7
|
/**
|
|
8
8
|
* The build task handler creates the build output for a dedicated build task. It is uniquely identified
|
|
@@ -113,46 +113,50 @@ class BuildTaskHandler {
|
|
|
113
113
|
return {
|
|
114
114
|
to: async (dest) => {
|
|
115
115
|
if (!this._hasBuildOption(BUILD_OPTION_OUTPUT_MODE, OUTPUT_MODE_RESULT_ONLY)) {
|
|
116
|
-
if (!
|
|
116
|
+
if (!path.isAbsolute(dest)) {
|
|
117
117
|
// relative to build task's destination path
|
|
118
118
|
dest = path.resolve(this.task.dest, dest)
|
|
119
119
|
}
|
|
120
120
|
this._pushFile(dest)
|
|
121
121
|
if (this._hasBuildOption(BUILD_OPTION_OUTPUT_MODE, OUTPUT_MODE_DEFAULT)) {
|
|
122
|
-
await fs.
|
|
122
|
+
await fs.mkdir(path.dirname(dest), { recursive: true })
|
|
123
|
+
await fs.writeFile(dest, typeof data === "object" && !Buffer.isBuffer(data) ? JSON.stringify(data, null, 2) : data)
|
|
123
124
|
}
|
|
124
125
|
}
|
|
125
126
|
}
|
|
126
127
|
}
|
|
127
128
|
}
|
|
128
129
|
|
|
130
|
+
// TODO only works with files due to fs.copyFile, check usages
|
|
129
131
|
/**
|
|
130
132
|
* Copy a file or directory if the build task option 'outputMode' does not have the value 'resultOnly'.
|
|
131
133
|
* The directory can have contents.
|
|
132
134
|
* <p>
|
|
133
135
|
* Note: The file name is stored in the list of files written by this build task handler.
|
|
134
136
|
* </p>
|
|
135
|
-
* @param {string}
|
|
137
|
+
* @param {string} src The absolute or relative source path of the file or directory to copy.
|
|
136
138
|
* Relative paths will be resolved to this task's source path.
|
|
137
139
|
* @param {string} dest The absolute or relative target path. Relative paths will be resolved to this task's destination path.
|
|
138
140
|
*
|
|
139
141
|
*/
|
|
140
|
-
copy(
|
|
142
|
+
copy(src) {
|
|
141
143
|
return {
|
|
142
144
|
to: async (dest) => {
|
|
143
145
|
if (!this._hasBuildOption(BUILD_OPTION_OUTPUT_MODE, OUTPUT_MODE_RESULT_ONLY)) {
|
|
144
|
-
if (!
|
|
146
|
+
if (!path.isAbsolute(src)) {
|
|
145
147
|
// relative to build task's source path
|
|
146
|
-
|
|
148
|
+
src = path.resolve(this.task.src, src)
|
|
147
149
|
}
|
|
148
|
-
if (!
|
|
150
|
+
if (!path.isAbsolute(dest)) {
|
|
149
151
|
// relative to build task's destination path
|
|
150
152
|
dest = path.resolve(this.task.dest, dest)
|
|
151
153
|
}
|
|
152
154
|
this._pushFile(dest)
|
|
153
155
|
if (this._hasBuildOption(BUILD_OPTION_OUTPUT_MODE, OUTPUT_MODE_DEFAULT)) {
|
|
154
|
-
//
|
|
155
|
-
|
|
156
|
+
if (fs.cp) { // Node.js >= 16.7
|
|
157
|
+
return fs.cp(src, dest, { recursive: true })
|
|
158
|
+
}
|
|
159
|
+
return this._copy(src, dest)
|
|
156
160
|
}
|
|
157
161
|
return dest
|
|
158
162
|
}
|
|
@@ -215,6 +219,7 @@ class BuildTaskHandler {
|
|
|
215
219
|
_hasBuildOption(qualifiedName, value) {
|
|
216
220
|
return hasOptionValue(this._getBuildOption(qualifiedName), value)
|
|
217
221
|
}
|
|
222
|
+
|
|
218
223
|
// Returns the value of the given build option defined for this build task.
|
|
219
224
|
_getBuildOption(qualifiedName) {
|
|
220
225
|
// build task options overwriting other settings
|
|
@@ -228,5 +233,16 @@ class BuildTaskHandler {
|
|
|
228
233
|
}
|
|
229
234
|
return getProperty(this._buildOptions, qualifiedName)
|
|
230
235
|
}
|
|
236
|
+
|
|
237
|
+
// Asynchronously copies the entire content from src to dest.
|
|
238
|
+
async _copy(src, dest) {
|
|
239
|
+
if ((await fs.stat(src)).isDirectory()) {
|
|
240
|
+
const entries = await fs.readdir(src)
|
|
241
|
+
return Promise.all(entries.map(async each => this._copy(path.join(src, each), path.join(dest, each))))
|
|
242
|
+
} else {
|
|
243
|
+
await fs.mkdir(path.dirname(dest), { recursive: true })
|
|
244
|
+
return fs.copyFile(src, dest)
|
|
245
|
+
}
|
|
246
|
+
}
|
|
231
247
|
}
|
|
232
248
|
module.exports = BuildTaskHandler
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
module.exports = class BuildTaskProvider {
|
|
3
3
|
constructor() {
|
|
4
4
|
//injected by framework
|
|
5
|
-
this._plugin = null
|
|
5
|
+
this._plugin = null
|
|
6
6
|
}
|
|
7
7
|
canHandleTask(task) {
|
|
8
8
|
// return this._plugin.provides.includes(task.for || task.use && this._getTaskId(task.use))
|
|
@@ -10,9 +10,7 @@ module.exports = class BuildTaskProvider {
|
|
|
10
10
|
loadHandler(task) {
|
|
11
11
|
// return module.require(`${this._plugin.path}/${task.for || this._getTaskId(task.use)}`)
|
|
12
12
|
}
|
|
13
|
-
async lookupTasks() {
|
|
14
|
-
return []
|
|
15
|
-
}
|
|
13
|
+
async lookupTasks(tasks) { }
|
|
16
14
|
async applyTaskDefaults(task) {
|
|
17
15
|
// task.for = task.for || this._getTaskId(task.use)
|
|
18
16
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
const
|
|
1
|
+
const fs = require('fs')
|
|
2
2
|
const path = require('path')
|
|
3
3
|
const _cds = require('./cds')
|
|
4
4
|
const { OUTPUT_MODE_DEFAULT, LOG_MODULE_NAMES } = require("./constants")
|
|
@@ -33,7 +33,7 @@ class BuildTaskProviderFactory {
|
|
|
33
33
|
}
|
|
34
34
|
|
|
35
35
|
async applyTaskDefaults(tasks) {
|
|
36
|
-
|
|
36
|
+
return Promise.all(tasks.map(async task => {
|
|
37
37
|
if (!task.for && !task.use) {
|
|
38
38
|
throw new Error("Invalid build task definition - property 'for' and property 'use' missing")
|
|
39
39
|
}
|
|
@@ -55,19 +55,14 @@ class BuildTaskProviderFactory {
|
|
|
55
55
|
}))
|
|
56
56
|
}
|
|
57
57
|
|
|
58
|
-
async lookupTasks() {
|
|
59
|
-
this.logger.debug("determining CDS build tasks from CDS configuration - applying defaults")
|
|
60
|
-
let tasks = []
|
|
58
|
+
async lookupTasks(tasks=[]) {
|
|
61
59
|
await Promise.all(this.providers.map(async (provider) => {
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
this.logger.error(`Build task provider ${provider.constructor.name} returned invalid type, array required.\nReceived ${JSON.stringify(pluginTasks)}`)
|
|
65
|
-
}
|
|
60
|
+
const snapShot = tasks
|
|
61
|
+
await this._lookupTasks(provider, tasks)
|
|
66
62
|
// apply defaults
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
this.logger._debug && this.logger.debug(`Build task provider ${provider.constructor.name} returned build tasks ${JSON.stringify(pluginTasks)}`)
|
|
63
|
+
const newTasks = tasks.filter(task => !snapShot.includes(task))
|
|
64
|
+
await this._applyTaskDefaults(provider, newTasks)
|
|
65
|
+
this.logger._debug && this.logger.debug(`Build task provider ${provider.constructor.name} returned build tasks ${JSON.stringify(newTasks)}`)
|
|
71
66
|
}))
|
|
72
67
|
return tasks
|
|
73
68
|
}
|
|
@@ -94,7 +89,7 @@ class BuildTaskProviderFactory {
|
|
|
94
89
|
|
|
95
90
|
/**
|
|
96
91
|
* Loads the build task handler implementation for the given build task.
|
|
97
|
-
* 'for' defines an alias for built-in handlers like 'hana', 'java
|
|
92
|
+
* 'for' defines an alias for built-in handlers like 'hana', 'java', 'node', 'fiori' or 'mtx'.
|
|
98
93
|
* 'use' defines the fully qualified module name of external build task handler implemenations.
|
|
99
94
|
* @param {object} task
|
|
100
95
|
*/
|
|
@@ -144,9 +139,9 @@ class BuildTaskProviderFactory {
|
|
|
144
139
|
return resolvedTask
|
|
145
140
|
}
|
|
146
141
|
|
|
147
|
-
async _lookupTasks(provider) {
|
|
142
|
+
async _lookupTasks(provider, tasks) {
|
|
148
143
|
try {
|
|
149
|
-
|
|
144
|
+
await provider.lookupTasks(tasks, this.buildOptions)
|
|
150
145
|
} catch (e) {
|
|
151
146
|
this.logger.error(`Build task provider ${provider.constructor.name} returned error:\n` + e)
|
|
152
147
|
throw e
|
package/bin/build/constants.js
CHANGED
|
@@ -6,20 +6,21 @@ exports.OUTPUT_MODE_RESULT_ONLY = "resultOnly"
|
|
|
6
6
|
|
|
7
7
|
exports.BUILD_TASK_NPM_SCOPE = "@sap"
|
|
8
8
|
exports.BUILD_TASK_PREFIX = exports.BUILD_TASK_NPM_SCOPE + "/cds/build"
|
|
9
|
-
exports.BUILD_TASK_JAVA = "java
|
|
10
|
-
exports.
|
|
9
|
+
exports.BUILD_TASK_JAVA = "java"
|
|
10
|
+
exports.BUILD_TASK_JAVA_CF = "java-cf"
|
|
11
|
+
exports.BUILD_TASK_NODEJS = "nodejs"
|
|
12
|
+
exports.BUILD_TASK_NODE_CF = "node-cf"
|
|
11
13
|
exports.BUILD_TASK_HANA = "hana"
|
|
12
14
|
exports.BUILD_TASK_FIORI = "fiori"
|
|
13
15
|
exports.BUILD_TASK_MTX = "mtx"
|
|
14
|
-
exports.
|
|
16
|
+
exports.BUILD_TASK_MTX_SIDECAR = "mtx-sidecar"
|
|
17
|
+
exports.BUILD_TASKS = [this.BUILD_TASK_JAVA, this.BUILD_TASK_JAVA_CF, this.BUILD_TASK_NODEJS, this.BUILD_TASK_NODE_CF, this.BUILD_TASK_HANA, this.BUILD_TASK_FIORI, this.BUILD_TASK_MTX, this.BUILD_TASK_MTX_SIDECAR]
|
|
15
18
|
|
|
16
19
|
exports.ODATA_VERSION = "odata.version"
|
|
17
20
|
exports.ODATA_VERSION_V2 = "v2"
|
|
18
21
|
exports.ODATA_VERSION_V4 = "v4"
|
|
19
22
|
|
|
20
|
-
exports.BUILD_MODE_INPLACE = "inplace"
|
|
21
23
|
exports.BUILD_NODEJS_EDMX_GENERAION = "build.nodejs.edmxgeneration" // WebIDE Fullstack
|
|
22
|
-
|
|
23
24
|
exports.EDMX_GENERATION = "edmxGeneration"
|
|
24
25
|
|
|
25
26
|
exports.SKIP_MANIFEST_GENERATION = "skipManifestGeneration"
|
|
@@ -31,11 +32,18 @@ exports.CONTENT_DEFAULT_CSN = "contentDefaultCsn" // create default CS
|
|
|
31
32
|
exports.CONTENT_EDMX = "contentEdmx" // create EDMX for required languages
|
|
32
33
|
exports.CONTENT_MANIFEST = "contentManifest" // create manifest.yml and .cfignore files
|
|
33
34
|
exports.CONTENT_PACKAGE_JSON = "contentPackageJson" // create package.json file if not existing, or modify existing package.json
|
|
34
|
-
exports.CONTENT_PACKAGELOCK_JSON = "contentPackageLockJson" // copy package-lock.json file if existing
|
|
35
|
+
exports.CONTENT_PACKAGELOCK_JSON = "contentPackageLockJson" // copy package-lock.json file if existing into deployment folder
|
|
35
36
|
exports.CONTENT_HDBTABLEDATA = "contentHdbtabledata" // create .hdbtabledata files for .csv files if not existing
|
|
37
|
+
exports.CONTENT_NPMRC = "contentNpmrc" // copy .npmrc file if existing into deployment folder
|
|
38
|
+
exports.CONTENT_CDSRC_JSON = "contentCdsrcJson" // copy .cdsrc.json file if existing into deployment folder
|
|
39
|
+
exports.CONTENT_NODE_MODULES = "contentNodeModules" // copy node_modules folder if existing into deployment folder
|
|
40
|
+
exports.CONTENT_ENV = "contentEnv" // copy .env file if existing into deployment folder
|
|
41
|
+
exports.CONTENT_DEFAULT_ENV_JSON = "contentDefaultEnvJson" // copy default-env.json file if existing into deployment folder
|
|
42
|
+
exports.CSV_FILE_DETECTION = "csvFileDetection" // detect CSV files based on CDS model location
|
|
36
43
|
|
|
37
44
|
exports.FOLDER_GEN = "gen"
|
|
38
45
|
exports.FILE_EXT_CDS = ".cds"
|
|
46
|
+
exports.MTX_SIDECAR_FOLDER = "mtx/sidecar" // default name of the mtx sidecar folder
|
|
39
47
|
|
|
40
48
|
exports.CDS_CONFIG_PATH_SEP = "/"
|
|
41
49
|
exports.SKIP_ASSERT_COMPILER_V2 = "skip-assert-compiler-v2"
|
package/bin/build/csv-reader.js
CHANGED
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
const {createReadStream, createWriteStream, readFile:rf} = require('fs')
|
|
2
2
|
const readFile = require('util').promisify(rf)
|
|
3
3
|
const {Readable} = require('stream')
|
|
4
|
+
const cds = require('../../lib')
|
|
4
5
|
|
|
5
6
|
const SEPARATOR = /[,;\t]/
|
|
6
|
-
module.exports = { parse:
|
|
7
|
+
module.exports = { parse: cds.parse.csv, readHeader, stripComments, serialize }
|
|
7
8
|
|
|
8
9
|
|
|
9
10
|
function serialize (rows, columns, bom='\ufeff') {
|
package/bin/build/index.js
CHANGED
|
@@ -1,11 +1,10 @@
|
|
|
1
1
|
const path = require('path')
|
|
2
|
-
const
|
|
2
|
+
const fs = require('fs')
|
|
3
3
|
const BuildTaskEngine = require('./buildTaskEngine')
|
|
4
4
|
const BuildTaskFactory = require('./buildTaskFactory')
|
|
5
5
|
const BuildTaskHandler = require('./buildTaskHandler')
|
|
6
6
|
const { LOG_MODULE_NAMES } = require('./constants')
|
|
7
7
|
const { BuildError } = require('./util')
|
|
8
|
-
const { BUILD_MODE_INPLACE } = require('./constants')
|
|
9
8
|
|
|
10
9
|
module.exports = Object.assign(build,
|
|
11
10
|
{ build, BuildTaskFactory, BuildTaskEngine, BuildTaskHandler, BuildError }
|
|
@@ -15,34 +14,29 @@ module.exports = Object.assign(build,
|
|
|
15
14
|
* New modular build.
|
|
16
15
|
*
|
|
17
16
|
* @param {object} options - commmand options as defined by build command.
|
|
18
|
-
* @param {object} _env - for testing purposes only, will be removed.
|
|
19
17
|
*/
|
|
20
|
-
async function build(options = {}
|
|
18
|
+
async function build(options = {}) {
|
|
21
19
|
const projectPath = path.resolve(options.project || '.')
|
|
22
20
|
|
|
23
21
|
if (!fs.lstatSync(projectPath).isDirectory()) {
|
|
24
22
|
return Promise.reject(`Project [${projectPath}] does not exist`)
|
|
25
23
|
}
|
|
26
24
|
|
|
27
|
-
const cds = require('./cds')
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
cds.env = cds.env._merge_with(_env)
|
|
25
|
+
const cds = require('./cds')
|
|
26
|
+
if (projectPath !== process.cwd()) {
|
|
27
|
+
const env = cds.env.for('cds', projectPath);
|
|
28
|
+
cds.env = env
|
|
29
|
+
cds.root = projectPath
|
|
33
30
|
}
|
|
31
|
+
const logger = options.logger || cds.log(LOG_MODULE_NAMES)
|
|
34
32
|
|
|
35
|
-
const buildOptions =
|
|
33
|
+
const buildOptions = _mergeCliOptions({ root: projectPath }, options)
|
|
36
34
|
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
cds.env.build.target = "."
|
|
40
|
-
}
|
|
41
|
-
let tasks = await new BuildTaskFactory(logger, cds).getTasks(buildOptions)
|
|
42
|
-
return new BuildTaskEngine(logger, cds).processTasks(tasks, buildOptions)
|
|
35
|
+
let tasks = await new BuildTaskFactory(logger).getTasks(buildOptions)
|
|
36
|
+
return new BuildTaskEngine(logger).processTasks(tasks, buildOptions)
|
|
43
37
|
}
|
|
44
38
|
|
|
45
|
-
function
|
|
39
|
+
function _mergeCliOptions(buildOptions, options) {
|
|
46
40
|
buildOptions["log-level"] = options["log-level"]
|
|
47
41
|
buildOptions.cli = options.cli
|
|
48
42
|
buildOptions.cmdOptions = options
|
|
@@ -1,18 +1,8 @@
|
|
|
1
1
|
const path = require('path')
|
|
2
|
-
const
|
|
2
|
+
const BuildTaskHandlerFeatureToggles = require('./buildTaskHandlerFeatureToggles')
|
|
3
3
|
const { BUILD_OPTION_OUTPUT_MODE, OUTPUT_MODE_RESULT_ONLY } = require('../constants')
|
|
4
4
|
|
|
5
|
-
class BuildTaskHandlerEdmx extends
|
|
6
|
-
init() {
|
|
7
|
-
this._result = {
|
|
8
|
-
dest: this.task.dest,
|
|
9
|
-
csn: {},
|
|
10
|
-
edmx: new Map(),
|
|
11
|
-
languages: new Set(),
|
|
12
|
-
services: new Set(),
|
|
13
|
-
languageBundles: {}
|
|
14
|
-
}
|
|
15
|
-
}
|
|
5
|
+
class BuildTaskHandlerEdmx extends BuildTaskHandlerFeatureToggles {
|
|
16
6
|
async compileToEdmx(model, edmxDest, compileOptions = {}) { // NOSONAR
|
|
17
7
|
const promises = []
|
|
18
8
|
const services = this.cds.reflect(model).services
|
|
@@ -55,38 +45,12 @@ class BuildTaskHandlerEdmx extends BuildTaskHandlerInternal {
|
|
|
55
45
|
return Promise.all(promises)
|
|
56
46
|
}
|
|
57
47
|
|
|
58
|
-
async compileToJson(model, csnDest, saveResult = true) {
|
|
59
|
-
// This will als add a @source prop containing the relative path to the origin .cds source file
|
|
60
|
-
// and a parsed _where clause for @restrict.{grant,where} annotations.
|
|
61
|
-
// The @source annotation is required for correct custom handler resolution if no @impl annotation has been defined as
|
|
62
|
-
// custom service handler implementations are relative to the origin .cds source files.
|
|
63
|
-
// For staging builds (task.src !== task.dest) the csn.json file that is served at runtime is copied into a corresponding srv subfolder.
|
|
64
|
-
// As a consequence the src folder name has to be included in the @source file name while for inplace builds (task.src === task.dest) this is not the case.
|
|
65
|
-
// This ensures that the paths are relative to the cwd when executing cds run.
|
|
66
|
-
const jsonOptions = {
|
|
67
|
-
cwd: this.buildOptions.root,
|
|
68
|
-
src: this.task.src === this.task.dest ? this.task.src : this.buildOptions.root
|
|
69
|
-
}
|
|
70
|
-
const csnStr = this.cds.compile.to.json(model, jsonOptions)
|
|
71
|
-
const csn = JSON.parse(csnStr)
|
|
72
|
-
if (saveResult) {
|
|
73
|
-
this._result.csn = csn
|
|
74
|
-
this._result.csn.meta = model.meta
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
// csnDest might be null
|
|
78
|
-
if (csnDest && !this.hasBuildOption(BUILD_OPTION_OUTPUT_MODE, OUTPUT_MODE_RESULT_ONLY)) {
|
|
79
|
-
await this.write(csnStr).to(path.join(csnDest, 'csn.json'))
|
|
80
|
-
}
|
|
81
|
-
return csn
|
|
82
|
-
}
|
|
83
|
-
|
|
84
48
|
/**
|
|
85
49
|
* Collect and write language bundles into a single i18n.json file.
|
|
86
50
|
* @param {Object} model
|
|
87
51
|
* @param {string} bundleDest
|
|
88
52
|
*/
|
|
89
|
-
|
|
53
|
+
async collectLanguageBundles(model, bundleDest, saveResult = true) {
|
|
90
54
|
// collect effective i18n properties...
|
|
91
55
|
let bundles = {}
|
|
92
56
|
const bundleGenerator = this.cds.localize.bundles4(model)
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
const fs = require('fs')
|
|
2
|
+
const path = require('path')
|
|
3
|
+
const { BUILD_OPTION_OUTPUT_MODE, OUTPUT_MODE_RESULT_ONLY } = require('../constants')
|
|
4
|
+
const BuildTaskHandlerInternal = require('./buildTaskHandlerInternal')
|
|
5
|
+
|
|
6
|
+
class FeatureToggleBuilder extends BuildTaskHandlerInternal {
|
|
7
|
+
init() {
|
|
8
|
+
this._result = {
|
|
9
|
+
dest: this.task.dest,
|
|
10
|
+
csn: {},
|
|
11
|
+
edmx: new Map(),
|
|
12
|
+
languages: new Set(),
|
|
13
|
+
services: new Set(),
|
|
14
|
+
languageBundles: {}
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
get ftsName() {
|
|
19
|
+
return path.dirname(this.env.features.folders || 'fts/*')
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
async compileAll(csn, destBase, destFts) {
|
|
23
|
+
const sources = await this._resolveSourcePaths(csn)
|
|
24
|
+
const dictionary = { base: null, features: null }
|
|
25
|
+
|
|
26
|
+
if (sources.features) {
|
|
27
|
+
// create base model as the given CSN is containing all features
|
|
28
|
+
dictionary.base = await this.cds.load(sources.base, this.options())
|
|
29
|
+
} else {
|
|
30
|
+
// CSN already represents the base model as no features exist
|
|
31
|
+
dictionary.base = csn
|
|
32
|
+
}
|
|
33
|
+
// preserve @location as @source properties
|
|
34
|
+
await this.compileToJson(dictionary.base, destBase)
|
|
35
|
+
|
|
36
|
+
if (sources.features) {
|
|
37
|
+
dictionary.features = await this._compileFeatures(sources.features, destBase, destFts)
|
|
38
|
+
}
|
|
39
|
+
return { dictionary, sources }
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
async collectAllLanguageBundles(dictionary, paths, destBase, destFts) {
|
|
43
|
+
// create language bundle for base model
|
|
44
|
+
await this.collectLanguageBundles(dictionary.base, destBase)
|
|
45
|
+
if (dictionary.features) {
|
|
46
|
+
// create language bundles for all features
|
|
47
|
+
for (const ftName in dictionary.features) {
|
|
48
|
+
// attach the sources information for i18n location reference
|
|
49
|
+
dictionary.features[ftName]['$sources'] = paths.features[ftName]
|
|
50
|
+
await this.collectLanguageBundles(dictionary.features[ftName], path.join(destFts, this.ftsName, ftName), false)
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
async _resolveSourcePaths(csn) {
|
|
56
|
+
const regex = new RegExp(path.resolve(this.buildOptions.root, this.ftsName).replace(/\\/g, '\\\\') + '[/|\\\\](?<ftName>[^/|\\\\]*)')
|
|
57
|
+
let paths = { base: [] }
|
|
58
|
+
|
|
59
|
+
// add ROOT source file paths for the base model
|
|
60
|
+
paths.base = this._resolveModel().reduce((acc, file) => {
|
|
61
|
+
const match = file.match(regex)
|
|
62
|
+
if (!match) {
|
|
63
|
+
acc.push(file)
|
|
64
|
+
}
|
|
65
|
+
return acc
|
|
66
|
+
}, [])
|
|
67
|
+
|
|
68
|
+
// keep existing behaviour and return paths returned by cds.resolve if features are not supported by this project
|
|
69
|
+
if (!fs.existsSync(path.join(this.buildOptions.root, this.ftsName))) {
|
|
70
|
+
return paths
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
// add source file paths for the features
|
|
74
|
+
paths.features = csn['$sources'].reduce((acc, file) => {
|
|
75
|
+
const match = file.match(regex)
|
|
76
|
+
if (match) {
|
|
77
|
+
const { ftName } = match.groups
|
|
78
|
+
//feature
|
|
79
|
+
if (!acc[ftName]) {
|
|
80
|
+
acc[ftName] = []
|
|
81
|
+
}
|
|
82
|
+
acc[ftName].push(file)
|
|
83
|
+
}
|
|
84
|
+
return acc
|
|
85
|
+
}, {})
|
|
86
|
+
|
|
87
|
+
return paths
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
async compileToJson(model, csnDest, saveResult = true) {
|
|
91
|
+
// This will als add a @source prop containing the relative path to the origin .cds source file
|
|
92
|
+
// and a parsed _where clause for @restrict.{grant,where} annotations.
|
|
93
|
+
// The @source annotation is required for correct custom handler resolution if no @impl annotation has been defined as
|
|
94
|
+
// custom service handler implementations are relative to the origin .cds source files.
|
|
95
|
+
// For staging builds (task.src !== task.dest) the csn.json file that is served at runtime is copied into a corresponding srv subfolder.
|
|
96
|
+
// As a consequence the src folder name has to be included in the @source file name while for inplace builds (task.src === task.dest) this is not the case.
|
|
97
|
+
// This ensures that the paths are relative to the cwd when executing cds run.
|
|
98
|
+
const jsonOptions = {
|
|
99
|
+
cwd: this.buildOptions.root,
|
|
100
|
+
src: this.task.src === this.task.dest ? this.task.src : this.buildOptions.root
|
|
101
|
+
}
|
|
102
|
+
const csnStr = this.cds.compile.to.json(model, jsonOptions)
|
|
103
|
+
const csn = JSON.parse(csnStr)
|
|
104
|
+
if (saveResult) {
|
|
105
|
+
this._result.csn = csn
|
|
106
|
+
this._result.csn.meta = model.meta
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
// csnDest might be null
|
|
110
|
+
if (csnDest && !this.hasBuildOption(BUILD_OPTION_OUTPUT_MODE, OUTPUT_MODE_RESULT_ONLY)) {
|
|
111
|
+
await this.write(csnStr).to(path.join(csnDest, 'csn.json'))
|
|
112
|
+
}
|
|
113
|
+
return csn
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
async _compileFeatures(ftsPaths, destBase, destFts) {
|
|
117
|
+
if (!ftsPaths) {
|
|
118
|
+
return
|
|
119
|
+
}
|
|
120
|
+
const features = {}
|
|
121
|
+
const options = { ...this.options(), flavor: 'parsed' }
|
|
122
|
+
const srvFolder = path.relative(destFts, destBase)
|
|
123
|
+
|
|
124
|
+
// create feature models
|
|
125
|
+
for (const ftName in ftsPaths) {
|
|
126
|
+
const ftCsn = await this.cds.load(ftsPaths[ftName], options)
|
|
127
|
+
|
|
128
|
+
// replace require paths by base model path to ensure precedence of feature annos
|
|
129
|
+
// see https://pages.github.tools.sap/cap/docs/cds/compiler-messages#anno-duplicate-unrelated-layer
|
|
130
|
+
ftCsn.requires = [path.join('../..', srvFolder, 'csn.json')]
|
|
131
|
+
|
|
132
|
+
const ftPath = path.join(destFts, this.ftsName, ftName)
|
|
133
|
+
await this.compileToJson(ftCsn, ftPath, false)
|
|
134
|
+
await this._validateFeature(ftPath)
|
|
135
|
+
features[ftName] = ftCsn
|
|
136
|
+
}
|
|
137
|
+
return features
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
async _validateFeature(ftPath) {
|
|
141
|
+
// features must not have other than base model dependencies, cross feature dependencies are not supported
|
|
142
|
+
// do not pass options.messages in order to avoid duplicate compiler messages
|
|
143
|
+
return this.cds.load([ftPath])
|
|
144
|
+
// version 2.13.9 of compileSources does not read the requires definition of parsed CSNs
|
|
145
|
+
// require('@sap/cds-compiler').compileSources({ '../..csn.json': baseCsn, 'feature.csn': ftCsn }, this.options())
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
module.exports = FeatureToggleBuilder
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
const
|
|
1
|
+
const fs = require('fs')
|
|
2
2
|
const path = require('path')
|
|
3
3
|
const BuildTaskHandler = require('../buildTaskHandler')
|
|
4
4
|
const { hasOptionValue } = require('../util')
|
|
@@ -47,7 +47,7 @@ class BuildTaskHandlerInternal extends BuildTaskHandler {
|
|
|
47
47
|
// the build results have already been deleted by the BuildTaskEngine if the build.target !== '.'
|
|
48
48
|
// make sure that src is not a subfolder of dest
|
|
49
49
|
if (this._buildOptions.root === this._buildOptions.target && this.task.src !== this.task.dest && !this._isSubDirectory(this.task.dest, this.task.src)) {
|
|
50
|
-
await fs.
|
|
50
|
+
await fs.promises.rm(this.task.dest, {force: true, recursive: true})
|
|
51
51
|
}
|
|
52
52
|
}
|
|
53
53
|
|
|
@@ -153,7 +153,6 @@ class BuildTaskHandlerInternal extends BuildTaskHandler {
|
|
|
153
153
|
// - are contained in this modules 'dest' folder
|
|
154
154
|
// - are contained in some generation folder
|
|
155
155
|
// - do NOT fullfill additional specific filter criteria
|
|
156
|
-
// NOTE: there is no specific handling for content that is part of the 'node_modules' folder as it might be required later on, e.g. reuse model content
|
|
157
156
|
return this._commonStagingBuildFilter(src, destDir) && (!customFilter || customFilter.call(this, src))
|
|
158
157
|
})
|
|
159
158
|
return Promise.all(
|