@sap/cds 5.9.6 → 6.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +266 -20
- package/apis/services.d.ts +1 -1
- package/app/fiori/preview.js +2 -6
- package/app/index.js +3 -3
- package/bin/build/buildTaskEngine.js +17 -15
- package/bin/build/buildTaskFactory.js +29 -19
- package/bin/build/buildTaskHandler.js +27 -11
- package/bin/build/buildTaskProvider.js +2 -4
- package/bin/build/buildTaskProviderFactory.js +11 -16
- package/bin/build/constants.js +14 -6
- package/bin/build/csv-reader.js +2 -1
- package/bin/build/index.js +12 -18
- package/bin/build/provider/buildTaskHandlerEdmx.js +3 -39
- package/bin/build/provider/buildTaskHandlerFeatureToggles.js +149 -0
- package/bin/build/provider/buildTaskHandlerInternal.js +2 -3
- package/bin/build/provider/buildTaskProviderInternal.js +108 -239
- package/bin/build/provider/fiori/index.js +2 -2
- package/bin/build/provider/hana/2migration.js +11 -11
- package/bin/build/provider/hana/2tabledata.js +3 -3
- package/bin/build/provider/hana/index.js +89 -99
- package/bin/build/provider/hana/migrationtable.js +4 -3
- package/bin/build/provider/java/index.js +101 -0
- package/bin/build/provider/java-cf/index.js +1 -101
- package/bin/build/provider/mtx/index.js +90 -53
- package/bin/build/provider/mtx/resourcesTarBuilder.js +68 -0
- package/bin/build/provider/mtx-sidecar/index.js +80 -0
- package/bin/build/provider/node-cf/index.js +1 -308
- package/bin/build/provider/nodejs/index.js +189 -0
- package/bin/build/util.js +19 -31
- package/bin/cds.js +5 -3
- package/bin/deploy/to-hana/cfUtil.js +31 -6
- package/bin/deploy/to-hana/gitUtil.js +5 -3
- package/bin/deploy/to-hana/hana.js +9 -10
- package/bin/{build → deploy/to-hana}/mtaUtil.js +10 -9
- package/bin/mtx/in-cds.js +19 -7
- package/bin/serve.js +56 -21
- package/bin/utils/log.js +13 -30
- package/bin/version.js +5 -4
- package/common.cds +61 -16
- package/lib/compile/cdsc.js +3 -2
- package/lib/compile/etc/_localized.js +15 -14
- package/lib/compile/for/drafts.js +3 -4
- package/lib/compile/for/java.js +13 -10
- package/lib/compile/for/nodejs.js +8 -8
- package/lib/compile/for/odata.js +7 -12
- package/lib/compile/for/sql.js +5 -6
- package/lib/compile/index.js +5 -4
- package/lib/compile/load.js +9 -11
- package/lib/compile/minify.js +8 -5
- package/lib/compile/parse.js +4 -2
- package/lib/compile/resolve.js +18 -15
- package/lib/compile/to/edm.js +0 -1
- package/lib/compile/to/gql.js +3 -2
- package/lib/compile/to/json.js +24 -17
- package/lib/connect/bindings.js +3 -2
- package/lib/connect/index.js +5 -5
- package/lib/core/classes.js +74 -2
- package/lib/core/entities.js +52 -3
- package/lib/core/reflect.js +2 -1
- package/lib/deploy.js +11 -8
- package/lib/env/defaults.js +4 -3
- package/lib/env/index.js +71 -31
- package/lib/env/presets.js +1 -14
- package/lib/env/requires.js +70 -20
- package/lib/env/serviceBindings.js +147 -0
- package/lib/i18n/localize.js +22 -23
- package/lib/index.js +148 -144
- package/lib/log/errors.js +55 -12
- package/lib/log/format/kibana.js +1 -1
- package/lib/log/index.js +4 -0
- package/lib/ql/SELECT.js +7 -2
- package/lib/ql/Whereable.js +8 -2
- package/lib/ql/index.js +2 -2
- package/lib/req/assert.js +71 -0
- package/lib/req/cds-context.js +38 -70
- package/lib/req/context.js +34 -21
- package/lib/req/request.js +12 -18
- package/lib/req/response.js +6 -2
- package/lib/req/user.js +30 -22
- package/lib/serve/Service-api.js +17 -12
- package/lib/serve/Service-dispatch.js +5 -9
- package/lib/serve/Service-methods.js +4 -3
- package/lib/serve/Transaction.js +24 -21
- package/lib/serve/adapters.js +15 -5
- package/lib/serve/factory.js +23 -20
- package/lib/serve/index.js +51 -54
- package/lib/utils/axios.js +8 -12
- package/lib/utils/index.js +3 -3
- package/lib/utils/resources/index.js +1 -44
- package/lib/utils/resources/tar.js +2 -1
- package/lib/utils/tests.js +13 -15
- package/libx/_runtime/.eslintrc +1 -1
- package/libx/_runtime/audit/Service.js +6 -4
- package/libx/_runtime/audit/generic/personal/access.js +19 -43
- package/libx/_runtime/audit/generic/personal/index.js +40 -34
- package/libx/_runtime/audit/generic/personal/modification.js +11 -9
- package/libx/_runtime/audit/generic/personal/utils.js +13 -6
- package/libx/_runtime/audit/utils/v2.js +6 -3
- package/libx/_runtime/auth/index.js +71 -66
- package/libx/_runtime/auth/strategies/JWT.js +3 -2
- package/libx/_runtime/auth/strategies/mock.js +54 -53
- package/libx/_runtime/auth/strategies/xssecUtils.js +3 -4
- package/libx/_runtime/auth/strategies/xsuaa.js +3 -2
- package/libx/_runtime/auth/utils.js +2 -15
- package/libx/_runtime/cds-services/adapter/odata-v4/Dispatcher.js +128 -42
- package/libx/_runtime/cds-services/adapter/odata-v4/OData.js +6 -3
- package/libx/_runtime/cds-services/adapter/odata-v4/ODataRequest.js +93 -73
- package/libx/_runtime/cds-services/adapter/odata-v4/handlers/action.js +10 -45
- package/libx/_runtime/cds-services/adapter/odata-v4/handlers/create.js +5 -9
- package/libx/_runtime/cds-services/adapter/odata-v4/handlers/error.js +9 -5
- package/libx/_runtime/cds-services/adapter/odata-v4/handlers/metadata.js +4 -2
- package/libx/_runtime/cds-services/adapter/odata-v4/handlers/read.js +60 -53
- package/libx/_runtime/cds-services/adapter/odata-v4/handlers/request.js +1 -1
- package/libx/_runtime/cds-services/adapter/odata-v4/handlers/update.js +15 -21
- package/libx/_runtime/cds-services/adapter/odata-v4/odata-to-cqn/ExpressionToCQN.js +8 -15
- package/libx/_runtime/cds-services/adapter/odata-v4/odata-to-cqn/expandToCQN.js +29 -41
- package/libx/_runtime/cds-services/adapter/odata-v4/odata-to-cqn/index.js +1 -4
- package/libx/_runtime/cds-services/adapter/odata-v4/odata-to-cqn/readToCQN.js +13 -13
- package/libx/_runtime/cds-services/adapter/odata-v4/odata-to-cqn/selectToCQN.js +0 -7
- package/libx/_runtime/cds-services/adapter/odata-v4/odata-to-cqn/utils.js +24 -1
- package/libx/_runtime/cds-services/adapter/odata-v4/okra/odata-commons/edm/EdmEntityContainer.js +1 -1
- package/libx/_runtime/cds-services/adapter/odata-v4/okra/odata-commons/uri/UriHelper.js +4 -3
- package/libx/_runtime/cds-services/adapter/odata-v4/okra/odata-commons/utils/PrimitiveValueDecoder.js +4 -5
- package/libx/_runtime/cds-services/adapter/odata-v4/okra/odata-commons/utils/ValueConverter.js +4 -3
- package/libx/_runtime/cds-services/adapter/odata-v4/okra/odata-commons/validator/ValueValidator.js +5 -3
- package/libx/_runtime/cds-services/adapter/odata-v4/okra/odata-server/core/ResponseHeaderSetter.js +2 -0
- package/libx/_runtime/cds-services/adapter/odata-v4/okra/odata-server/invocation/DebugSerializingCommand.js +1 -1
- package/libx/_runtime/cds-services/adapter/odata-v4/okra/odata-server/invocation/PresetResponseHeadersCommand.js +1 -1
- package/libx/_runtime/cds-services/adapter/odata-v4/okra/odata-server/invocation/SerializingCommand.js +1 -1
- package/libx/_runtime/cds-services/adapter/odata-v4/okra/odata-server/invocation/SetResponseHeadersCommand.js +1 -1
- package/libx/_runtime/cds-services/adapter/odata-v4/okra/odata-server/serializer/ContextURLFactory.js +3 -2
- package/libx/_runtime/cds-services/adapter/odata-v4/okra/odata-server/serializer/ErrorJsonSerializer.js +3 -1
- package/libx/_runtime/cds-services/adapter/odata-v4/okra/odata-server/serializer/SerializerFactory.js +1 -0
- package/libx/_runtime/cds-services/adapter/odata-v4/okra/odata-server/serializer/TrustedResourceJsonSerializer.js +3 -3
- package/libx/_runtime/cds-services/adapter/odata-v4/utils/data.js +36 -25
- package/libx/_runtime/cds-services/adapter/odata-v4/utils/handlerUtils.js +100 -91
- package/libx/_runtime/cds-services/adapter/odata-v4/utils/metaInfo.js +382 -0
- package/libx/_runtime/cds-services/adapter/odata-v4/utils/oDataConfiguration.js +1 -4
- package/libx/_runtime/cds-services/adapter/odata-v4/utils/omitValues.js +5 -6
- package/libx/_runtime/cds-services/adapter/odata-v4/utils/readAfterWrite.js +77 -21
- package/libx/_runtime/cds-services/adapter/odata-v4/utils/request.js +3 -11
- package/libx/_runtime/cds-services/adapter/odata-v4/utils/result.js +91 -69
- package/libx/_runtime/cds-services/adapter/odata-v4/utils/stream.js +27 -6
- package/libx/_runtime/cds-services/adapter/rest/utils/validation-checks.js +7 -17
- package/libx/_runtime/cds-services/services/Service.js +17 -76
- package/libx/_runtime/cds-services/services/utils/columns.js +6 -4
- package/libx/_runtime/cds-services/services/utils/compareJson.js +1 -53
- package/libx/_runtime/cds-services/services/utils/differ.js +15 -19
- package/libx/_runtime/cds-services/util/assert.js +107 -34
- package/libx/_runtime/cds.js +1 -31
- package/libx/_runtime/common/aspects/Association.js +40 -54
- package/libx/_runtime/common/aspects/any.js +61 -6
- package/libx/_runtime/common/aspects/entity.js +19 -79
- package/libx/_runtime/common/composition/data.js +2 -2
- package/libx/_runtime/common/composition/delete.js +16 -18
- package/libx/_runtime/common/composition/tree.js +10 -10
- package/libx/_runtime/common/composition/update.js +3 -2
- package/libx/_runtime/common/constants/events.js +15 -0
- package/libx/_runtime/common/error/entry.js +9 -3
- package/libx/_runtime/common/error/frontend.js +13 -19
- package/libx/_runtime/common/error/index.js +8 -3
- package/libx/_runtime/common/generic/auth/capabilities.js +2 -1
- package/libx/_runtime/common/generic/auth/constants.js +1 -4
- package/libx/_runtime/common/generic/auth/requires.js +1 -1
- package/libx/_runtime/common/generic/auth/restrict.js +12 -28
- package/libx/_runtime/common/generic/auth/restrictions.js +12 -4
- package/libx/_runtime/common/generic/auth/utils.js +2 -1
- package/libx/_runtime/common/generic/crud.js +9 -60
- package/libx/_runtime/common/generic/etag.js +41 -7
- package/libx/_runtime/common/generic/input.js +128 -66
- package/libx/_runtime/common/generic/paging.js +9 -3
- package/libx/_runtime/common/generic/put.js +2 -2
- package/libx/_runtime/common/generic/sorting.js +11 -4
- package/libx/_runtime/common/generic/temporal.js +0 -5
- package/libx/_runtime/common/i18n/messages.properties +2 -1
- package/libx/_runtime/common/utils/binary.js +69 -0
- package/libx/_runtime/common/utils/cqn.js +39 -14
- package/libx/_runtime/common/utils/cqn2cqn4sql.js +93 -59
- package/libx/_runtime/common/utils/csn.js +87 -85
- package/libx/_runtime/common/utils/dollar.js +8 -7
- package/libx/_runtime/common/utils/draft.js +1 -1
- package/libx/_runtime/common/utils/foreignKeyPropagations.js +23 -7
- package/libx/_runtime/common/utils/generateOnCond.js +2 -1
- package/libx/_runtime/common/utils/keys.js +30 -13
- package/libx/_runtime/common/utils/postProcessing.js +6 -1
- package/libx/_runtime/common/utils/quotingStyles.js +0 -23
- package/libx/_runtime/common/utils/resolveStructured.js +23 -26
- package/libx/_runtime/common/utils/resolveView.js +4 -1
- package/libx/_runtime/common/utils/rewriteAsterisks.js +3 -0
- package/libx/_runtime/common/utils/search2cqn4sql.js +4 -13
- package/libx/_runtime/common/utils/searchToLike.js +9 -13
- package/libx/_runtime/common/utils/streamProp.js +35 -0
- package/libx/_runtime/common/utils/structured.js +12 -18
- package/libx/_runtime/common/utils/template.js +3 -5
- package/libx/_runtime/common/utils/templateProcessor.js +22 -14
- package/libx/_runtime/common/utils/unionCqnTemplate.js +4 -14
- package/libx/_runtime/db/Service.js +2 -1
- package/libx/_runtime/db/expand/expand-v2.js +2 -2
- package/libx/_runtime/db/expand/expandCQNToJoin.js +7 -6
- package/libx/_runtime/db/generic/input.js +14 -17
- package/libx/_runtime/db/generic/integrity.js +1 -2
- package/libx/_runtime/db/generic/update.js +14 -1
- package/libx/_runtime/db/query/read.js +0 -1
- package/libx/_runtime/db/query/update.js +1 -1
- package/libx/_runtime/db/sql-builder/BaseBuilder.js +1 -1
- package/libx/_runtime/db/sql-builder/ExpressionBuilder.js +5 -31
- package/libx/_runtime/db/sql-builder/InsertBuilder.js +1 -1
- package/libx/_runtime/db/sql-builder/ReferenceBuilder.js +0 -9
- package/libx/_runtime/db/sql-builder/SelectBuilder.js +11 -10
- package/libx/_runtime/db/sql-builder/UpdateBuilder.js +2 -2
- package/libx/_runtime/db/sql-builder/annotations.js +1 -2
- package/libx/_runtime/db/utils/coloredTxCommands.js +5 -0
- package/libx/_runtime/db/utils/columns.js +1 -1
- package/libx/_runtime/db/utils/propagateForeignKeys.js +10 -2
- package/libx/_runtime/extensibility/activate.js +69 -0
- package/libx/_runtime/extensibility/add.js +41 -0
- package/libx/_runtime/extensibility/addExtension.js +68 -0
- package/libx/_runtime/extensibility/defaults.js +39 -0
- package/libx/_runtime/extensibility/{uiflex/handler → handler}/transformREAD.js +0 -0
- package/libx/_runtime/extensibility/{uiflex/handler → handler}/transformRESULT.js +2 -2
- package/libx/_runtime/extensibility/{uiflex/handler → handler}/transformWRITE.js +2 -2
- package/libx/_runtime/extensibility/push.js +61 -0
- package/libx/_runtime/extensibility/service.js +21 -0
- package/libx/_runtime/extensibility/{uiflex/utils.js → utils.js} +39 -3
- package/libx/_runtime/extensibility/validation.js +53 -0
- package/libx/_runtime/extensibility/views.js +12 -0
- package/libx/_runtime/fiori/generic/activate.js +6 -4
- package/libx/_runtime/fiori/generic/before.js +17 -29
- package/libx/_runtime/fiori/generic/cancel.js +2 -4
- package/libx/_runtime/fiori/generic/delete.js +2 -4
- package/libx/_runtime/fiori/generic/edit.js +3 -7
- package/libx/_runtime/fiori/generic/index.js +31 -0
- package/libx/_runtime/fiori/generic/new.js +2 -4
- package/libx/_runtime/fiori/generic/patch.js +4 -8
- package/libx/_runtime/fiori/generic/prepare.js +2 -4
- package/libx/_runtime/fiori/generic/read.js +137 -162
- package/libx/_runtime/fiori/generic/readOverDraft.js +10 -4
- package/libx/_runtime/fiori/utils/handler.js +10 -5
- package/libx/_runtime/fiori/utils/where.js +1 -4
- package/libx/_runtime/hana/Service.js +14 -7
- package/libx/_runtime/hana/customBuilder/CustomSelectBuilder.js +1 -1
- package/libx/_runtime/hana/dynatrace.js +2 -2
- package/libx/_runtime/hana/localized.js +7 -6
- package/libx/_runtime/hana/pool.js +9 -6
- package/libx/_runtime/hana/search.js +2 -3
- package/libx/_runtime/hana/{searchToContains.js → search2Contains.js} +5 -2
- package/libx/_runtime/hana/search2cqn4sql.js +20 -17
- package/libx/_runtime/index.js +2 -6
- package/libx/_runtime/messaging/AMQPWebhookMessaging.js +11 -2
- package/libx/_runtime/messaging/common-utils/AMQPClient.js +4 -3
- package/libx/_runtime/messaging/common-utils/appId.js +9 -0
- package/libx/_runtime/messaging/common-utils/authorizedRequest.js +2 -18
- package/libx/_runtime/messaging/common-utils/connections.js +1 -1
- package/libx/_runtime/messaging/enterprise-messaging-shared.js +2 -2
- package/libx/_runtime/messaging/enterprise-messaging-utils/EMManagement.js +305 -231
- package/libx/_runtime/messaging/enterprise-messaging-utils/cloudEvents.js +2 -2
- package/libx/_runtime/messaging/enterprise-messaging-utils/options-management.js +15 -8
- package/libx/_runtime/messaging/enterprise-messaging-utils/options-messaging.js +57 -14
- package/libx/_runtime/messaging/enterprise-messaging.js +14 -19
- package/libx/_runtime/messaging/file-based.js +2 -1
- package/libx/_runtime/messaging/http-utils/token.js +18 -6
- package/libx/_runtime/messaging/message-queuing-utils/options-management.js +22 -12
- package/libx/_runtime/messaging/message-queuing-utils/options-messaging.js +27 -14
- package/libx/_runtime/messaging/message-queuing.js +138 -85
- package/libx/_runtime/messaging/outbox/utils.js +13 -7
- package/libx/_runtime/messaging/redis-messaging.js +0 -1
- package/libx/_runtime/messaging/service.js +4 -1
- package/libx/_runtime/remote/Service.js +24 -18
- package/libx/_runtime/remote/utils/client.js +84 -46
- package/libx/_runtime/remote/utils/data.js +23 -6
- package/libx/_runtime/sqlite/Service.js +14 -13
- package/libx/_runtime/sqlite/convertAssocToOneManaged.js +2 -0
- package/libx/_runtime/sqlite/customBuilder/CustomSelectBuilder.js +1 -0
- package/libx/_runtime/sqlite/execute.js +3 -9
- package/libx/_runtime/types/api.js +23 -11
- package/libx/common/utils/ucsn.js +15 -9
- package/libx/odata/afterburner.js +109 -29
- package/libx/odata/cqn2odata.js +48 -9
- package/libx/odata/grammar.pegjs +261 -157
- package/libx/odata/index.js +21 -9
- package/libx/odata/parseToCqn.js +8 -5
- package/libx/odata/parser.js +1 -1
- package/libx/odata/utils.js +13 -3
- package/libx/rest/RestAdapter.js +173 -113
- package/libx/rest/RestRequest.js +3 -2
- package/libx/rest/middleware/create.js +8 -6
- package/libx/rest/middleware/delete.js +6 -13
- package/libx/rest/middleware/error.js +1 -1
- package/libx/rest/middleware/input.js +6 -6
- package/libx/rest/middleware/operation.js +8 -3
- package/libx/rest/middleware/parse.js +3 -3
- package/libx/rest/middleware/payload.js +12 -0
- package/libx/rest/middleware/read.js +12 -2
- package/libx/rest/middleware/update.js +3 -3
- package/package.json +4 -6
- package/server.js +3 -44
- package/srv/extensibility-service.cds +56 -0
- package/srv/extensibility-service.js +1 -0
- package/srv/extensions.cds +8 -0
- package/srv/model-provider.cds +59 -0
- package/srv/model-provider.js +163 -0
- package/srv/mtx.cds +2 -0
- package/srv/mtx.js +22 -0
- package/srv/outbox.cds +2 -0
- package/tasks/enterprise-messaging-deploy.js +19 -12
- package/lib/serve/Service-compat.js +0 -36
- package/libx/_runtime/audit/generic/personal/constants.js +0 -4
- package/libx/_runtime/auth/strategies/dwc.js +0 -45
- package/libx/_runtime/cds-services/adapter/odata-v4/utils/dispatcherUtils.js +0 -56
- package/libx/_runtime/cds-services/adapter/rest/Rest.js +0 -183
- package/libx/_runtime/cds-services/adapter/rest/RestRequest.js +0 -67
- package/libx/_runtime/cds-services/adapter/rest/handlers/create.js +0 -82
- package/libx/_runtime/cds-services/adapter/rest/handlers/delete.js +0 -39
- package/libx/_runtime/cds-services/adapter/rest/handlers/operation.js +0 -63
- package/libx/_runtime/cds-services/adapter/rest/handlers/read.js +0 -52
- package/libx/_runtime/cds-services/adapter/rest/handlers/update.js +0 -81
- package/libx/_runtime/cds-services/adapter/rest/rest-to-cqn/index.js +0 -56
- package/libx/_runtime/cds-services/adapter/rest/rest-to-cqn/utils.js +0 -33
- package/libx/_runtime/cds-services/adapter/rest/to.js +0 -8
- package/libx/_runtime/cds-services/adapter/rest/utils/binary.js +0 -50
- package/libx/_runtime/cds-services/adapter/rest/utils/data.js +0 -117
- package/libx/_runtime/cds-services/adapter/rest/utils/header-checks.js +0 -14
- package/libx/_runtime/cds-services/adapter/rest/utils/key-value-utils.js +0 -30
- package/libx/_runtime/cds-services/adapter/rest/utils/parse-url.js +0 -250
- package/libx/_runtime/cds-services/adapter/rest/utils/result.js +0 -26
- package/libx/_runtime/cds-services/services/utils/handlerUtils.js +0 -200
- package/libx/_runtime/common/aspects/utils.js +0 -152
- package/libx/_runtime/common/toggles/handler.js +0 -21
- package/libx/_runtime/common/utils/extensibilityUtils.js +0 -18
- package/libx/_runtime/extensibility/mps/index.js +0 -5
- package/libx/_runtime/extensibility/mps/service.js +0 -111
- package/libx/_runtime/extensibility/mps/tar.js +0 -42
- package/libx/_runtime/extensibility/mps/utils.js +0 -11
- package/libx/_runtime/extensibility/uiflex/index.js +0 -54
- package/libx/_runtime/extensibility/uiflex/service.js +0 -276
- package/libx/_runtime/messaging/common-utils/naming-conventions.js +0 -20
- package/libx/_runtime/remote/utils/client-types.d.ts +0 -7
- package/libx/gql/GraphQLAdapter.js +0 -33
- package/libx/gql/constants/adapter.js +0 -69
- package/libx/gql/constants/cds.js +0 -18
- package/libx/gql/constants/graphql.js +0 -33
- package/libx/gql/readme.md +0 -1
- package/libx/gql/resolvers/crud/create.js +0 -20
- package/libx/gql/resolvers/crud/delete.js +0 -29
- package/libx/gql/resolvers/crud/index.js +0 -6
- package/libx/gql/resolvers/crud/read.js +0 -30
- package/libx/gql/resolvers/crud/update.js +0 -42
- package/libx/gql/resolvers/crud/utils/index.js +0 -36
- package/libx/gql/resolvers/field.js +0 -5
- package/libx/gql/resolvers/index.js +0 -7
- package/libx/gql/resolvers/mutation.js +0 -23
- package/libx/gql/resolvers/parse/ast/enrich.js +0 -52
- package/libx/gql/resolvers/parse/ast/fragment.js +0 -11
- package/libx/gql/resolvers/parse/ast/fromObject.js +0 -39
- package/libx/gql/resolvers/parse/ast/index.js +0 -3
- package/libx/gql/resolvers/parse/ast/meta.js +0 -4
- package/libx/gql/resolvers/parse/ast/variable.js +0 -7
- package/libx/gql/resolvers/parse/ast2cqn/columns.js +0 -44
- package/libx/gql/resolvers/parse/ast2cqn/entries.js +0 -31
- package/libx/gql/resolvers/parse/ast2cqn/index.js +0 -8
- package/libx/gql/resolvers/parse/ast2cqn/limit.js +0 -6
- package/libx/gql/resolvers/parse/ast2cqn/orderBy.js +0 -24
- package/libx/gql/resolvers/parse/ast2cqn/utils/index.js +0 -3
- package/libx/gql/resolvers/parse/ast2cqn/where.js +0 -70
- package/libx/gql/resolvers/parse/utils/index.js +0 -8
- package/libx/gql/resolvers/query.js +0 -13
- package/libx/gql/resolvers/root.js +0 -34
- package/libx/gql/schema/generate.js +0 -18
- package/libx/gql/schema/index.js +0 -5
- package/libx/gql/schema/mutation.js +0 -76
- package/libx/gql/schema/query.js +0 -108
- package/libx/gql/schema/typeDefMap.js +0 -45
- package/libx/gql/schema/utils/index.js +0 -54
- package/libx/gql/utils/index.js +0 -12
- package/libx/rest/middleware/auth.js +0 -20
- package/libx/rest/middleware/content.js +0 -19
- package/srv/flex.cds +0 -21
- package/srv/flex.js +0 -1
- package/srv/mps.cds +0 -23
- package/srv/mps.js +0 -1
- package/srv/outbox.js +0 -0
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
const
|
|
1
|
+
const fs = require('fs')
|
|
2
2
|
const path = require('path')
|
|
3
3
|
const _cds = require('./cds'), { log } = _cds.exec
|
|
4
4
|
const BuildTaskProviderFactory = require('./buildTaskProviderFactory')
|
|
5
5
|
const { hasJavaNature, getProperty, redactCredentials } = require('./util')
|
|
6
|
-
const { FILE_EXT_CDS,
|
|
6
|
+
const { FILE_EXT_CDS, BUILD_TASK_JAVA_CF, LOG_MODULE_NAMES, BUILD_TASK_JAVA } = require("./constants")
|
|
7
7
|
|
|
8
8
|
class BuildTaskFactory {
|
|
9
9
|
constructor(logger, cds) {
|
|
@@ -65,24 +65,35 @@ class BuildTaskFactory {
|
|
|
65
65
|
const buildOptions = providerFactory.buildOptions
|
|
66
66
|
this.logger.log(`determining build tasks for project [${buildOptions.root}].`)
|
|
67
67
|
|
|
68
|
+
// clear model cache - see https://github.tools.sap/cap/cds/pull/181
|
|
69
|
+
// Required as cds.serve is invoking cds.resolve('*') which caused cds to cache the current model state
|
|
70
|
+
// which in turn screwed-up all subsequent tests - see ./lib/compile/resolve.js#L67 and ./lib/compile/resolve.js#L58
|
|
71
|
+
this.cds.resolve.cache = {}
|
|
72
|
+
|
|
68
73
|
let tasks = this._getExistingTasks()
|
|
69
74
|
if (tasks.length === 0) {
|
|
70
75
|
tasks = await providerFactory.lookupTasks()
|
|
76
|
+
await providerFactory.applyTaskDefaults(tasks)
|
|
71
77
|
} else {
|
|
72
78
|
// 1. apply default values including task.for and task.use and ensure that for all tasks a provider exists - throwing error otherwise
|
|
73
79
|
await providerFactory.applyTaskDefaults(tasks)
|
|
80
|
+
await providerFactory.lookupTasks(tasks)
|
|
74
81
|
}
|
|
75
82
|
|
|
83
|
+
// 3. filters the list of build tasks and adapts according to given CLI options
|
|
76
84
|
const existingTasks = tasks
|
|
77
|
-
|
|
78
|
-
|
|
85
|
+
tasks = await this._applyCliTaskOptions(providerFactory, tasks)
|
|
86
|
+
|
|
87
|
+
// 2. add dependencies
|
|
88
|
+
await providerFactory.lookupTasks(tasks)
|
|
89
|
+
|
|
79
90
|
if (tasks !== existingTasks && tasks.some(task => !existingTasks.find(existingTask => existingTask === task))) {
|
|
80
91
|
// a different task shall be executed
|
|
81
92
|
await providerFactory.applyTaskDefaults(tasks)
|
|
82
93
|
}
|
|
83
94
|
|
|
84
95
|
// obligatory task defaults shared by all tasks
|
|
85
|
-
this.
|
|
96
|
+
this._applyCommonTaskDefaults(tasks, buildOptions)
|
|
86
97
|
|
|
87
98
|
// ensure correct values for optional build task properties, error for missing mandatory properties
|
|
88
99
|
this._validateBuildTasks(tasks)
|
|
@@ -95,7 +106,7 @@ class BuildTaskFactory {
|
|
|
95
106
|
return Array.isArray(getProperty(this.env, 'build.tasks')) ? JSON.parse(JSON.stringify(this.env.build.tasks)) : []
|
|
96
107
|
}
|
|
97
108
|
|
|
98
|
-
|
|
109
|
+
_applyCommonTaskDefaults(tasks, buildOptions) {
|
|
99
110
|
tasks.forEach(task => {
|
|
100
111
|
this._setTaskOptions(task, buildOptions.root)
|
|
101
112
|
if (!task.src) {
|
|
@@ -113,7 +124,7 @@ class BuildTaskFactory {
|
|
|
113
124
|
}
|
|
114
125
|
|
|
115
126
|
_setDefaultBuildTargetFolder(tasks, buildOptions) {
|
|
116
|
-
const task = tasks.find(task => task.for ===
|
|
127
|
+
const task = tasks.find(task => task.for === BUILD_TASK_JAVA_CF || task.for === BUILD_TASK_JAVA)
|
|
117
128
|
const srv = task ? task.src : BuildTaskFactory._getModuleFolder(buildOptions.root, BuildTaskFactory._flatten([this.env.folders.srv])) || "srv"
|
|
118
129
|
|
|
119
130
|
// Java projects use "." as the default build target folder
|
|
@@ -124,10 +135,6 @@ class BuildTaskFactory {
|
|
|
124
135
|
}
|
|
125
136
|
|
|
126
137
|
_getDefaultModelOptions(projectPath) {
|
|
127
|
-
// clear model cache - see https://github.tools.sap/cap/cds/pull/181
|
|
128
|
-
// Required as cds.serve is invoking cds.resolve('*') which caused cds to cache the current model state
|
|
129
|
-
// which in turn screwed-up all subsequent tests - see ./lib/compile/resolve.js#L67 and ./lib/compile/resolve.js#L58
|
|
130
|
-
this.cds.resolve.cache = {}
|
|
131
138
|
const fts = this.env.features.folders
|
|
132
139
|
const modelPaths = this.cds.resolve(!fts ? '*' : ['*', fts], false)
|
|
133
140
|
return this._pushModelPaths(projectPath, [], modelPaths)
|
|
@@ -161,26 +168,29 @@ class BuildTaskFactory {
|
|
|
161
168
|
return false
|
|
162
169
|
}
|
|
163
170
|
|
|
164
|
-
_applyCliTaskOptions(
|
|
171
|
+
async _applyCliTaskOptions(providerFactory, tasks) {
|
|
172
|
+
const { buildOptions } = providerFactory
|
|
165
173
|
if (buildOptions.cmdOptions) {
|
|
166
174
|
const options = buildOptions.cmdOptions
|
|
167
175
|
|
|
168
176
|
// filter tasks using either option for, use, src
|
|
169
177
|
tasks = tasks.filter(task => {
|
|
170
|
-
return (!options.use || options.use === task.use)
|
|
178
|
+
return (!options.use || options.use === task.use)
|
|
179
|
+
&& (!options.for || options.for === task.for)
|
|
180
|
+
&& (!options.src || options.src === task.src)
|
|
171
181
|
})
|
|
172
|
-
|
|
173
182
|
if (tasks.length === 0 && (options.for || options.use)) {
|
|
174
|
-
|
|
183
|
+
const task = {}
|
|
175
184
|
if ((options.for)) {
|
|
176
|
-
|
|
185
|
+
task.for = options.for
|
|
177
186
|
}
|
|
178
187
|
if ((options.use)) {
|
|
179
|
-
|
|
188
|
+
task.use = options.use
|
|
180
189
|
}
|
|
181
190
|
if (options.src) {
|
|
182
|
-
|
|
191
|
+
task.src = options.src
|
|
183
192
|
}
|
|
193
|
+
tasks.push(task)
|
|
184
194
|
}
|
|
185
195
|
// apply remaining cli options to filtered tasks
|
|
186
196
|
tasks.forEach(task => {
|
|
@@ -217,7 +227,7 @@ class BuildTaskFactory {
|
|
|
217
227
|
|
|
218
228
|
return keys.reduce((acc, key, idx) => {
|
|
219
229
|
// render either "for" OR "use" value
|
|
220
|
-
return acc + (key !== "use" || keys[idx - 1] !== "for" ? (acc !== "{" ? ", " : "") + JSON.stringify(key) + ":" + JSON.stringify(task[key]) : "")
|
|
230
|
+
return acc + (!key.match("^_") ? (key !== "use" || keys[idx - 1] !== "for" ? (acc !== "{" ? ", " : "") + JSON.stringify(key) + ":" + JSON.stringify(task[key]) : "") : "")
|
|
221
231
|
}, "{") + "}"
|
|
222
232
|
}
|
|
223
233
|
|
|
@@ -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(
|