@sap/cds-dk 10.0.6 → 10.1.0
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 +107 -0
- package/bin/add.js +7 -23
- package/bin/bind.js +10 -0
- package/bin/build.js +20 -34
- package/bin/cds.js +1 -1
- package/bin/compile/index.js +15 -41
- package/bin/completion/completionFs.js +11 -8
- package/bin/completion/index.js +592 -80
- package/bin/completion/scripts/cds.fish +568 -0
- package/bin/completion/scripts/cds.ps1 +329 -0
- package/bin/completion/scripts/cds.sh +261 -0
- package/bin/completion/scripts/cds.zsh +230 -0
- package/bin/completion/templates/cds-tmpl.fish +65 -0
- package/bin/completion/templates/cds-tmpl.ps1 +208 -0
- package/bin/completion/templates/cds-tmpl.sh +93 -0
- package/bin/completion/templates/cds-tmpl.zsh +74 -0
- package/bin/deploy/index.js +7 -1
- package/bin/deploy/options.js +25 -0
- package/{lib → bin}/deploy/to-hana/hana.js +8 -8
- package/{lib → bin}/deploy/to-hana/hdiDeployUtil.js +1 -1
- package/bin/deploy/{to-hana.js → to-hana/index.js} +1 -1
- package/{lib → bin}/deploy/to-hana/mtaUtil.js +1 -1
- package/bin/deploy/to-sql.js +0 -2
- package/bin/export.js +35 -5
- package/bin/help/export.md +3 -0
- package/bin/help.js +1 -5
- package/bin/import.js +6 -0
- package/bin/init.js +5 -24
- package/bin/inspect.js +6 -0
- package/bin/login.js +26 -20
- package/bin/pull.js +19 -6
- package/bin/push.js +19 -6
- package/bin/up.js +14 -11
- package/{lib → bin}/upgrade/constants.js +1 -1
- package/bin/{upgrade.js → upgrade/index.js} +2 -2
- package/{lib → bin}/upgrade/preflight/consistency.js +1 -1
- package/{lib → bin}/upgrade/preflight/index.js +1 -1
- package/{lib → bin}/upgrade/steps/analyze/index.js +1 -1
- package/{lib → bin}/upgrade/steps/install.js +1 -1
- package/{lib → bin}/upgrade/steps/openrewrite.js +1 -1
- package/{lib → bin}/upgrade/steps/removals.js +1 -1
- package/{lib → bin}/upgrade/steps/rewrite.js +1 -1
- package/{lib → bin}/upgrade/steps/verify.js +1 -1
- package/{lib/upgrade/index.js → bin/upgrade/upgrade.js} +2 -2
- package/{lib → bin}/upgrade/util/pom.js +2 -2
- package/{lib → bin}/upgrade/util/prompt.js +1 -1
- package/bin/util/containerize.js +8 -4
- package/bin/version.js +10 -1
- package/{lib → bin}/watch/hot-reload.js +1 -1
- package/bin/{watch.js → watch/index.js} +17 -9
- package/{lib → bin}/watch/livereload-connect.js +1 -1
- package/{lib → bin}/watch/vite-watch.js +1 -1
- package/{lib → bin}/watch/watched.js +2 -2
- package/lib/build/constants.js +1 -1
- package/lib/build/plugins/fiori/index.js +31 -2
- package/lib/build/plugins/internal.js +4 -2
- package/lib/build/plugins/mtx-sidecar/index.js +7 -8
- package/lib/build/plugins/nodejs/index.js +64 -7
- package/lib/compile/to_asyncapi.js +1 -1
- package/lib/env/schema.js +16 -0
- package/lib/env/schemas/cds-rc.js +1 -76
- package/lib/import/importapi.js +2 -3
- package/lib/import/message.js +0 -2
- package/lib/init/constants.js +2 -1
- package/lib/init/index.js +2 -2
- package/lib/init/merge.js +123 -280
- package/lib/init/plugin.js +3 -1
- package/lib/init/projectReader.js +22 -6
- package/lib/init/registries/xs-app.js +3 -5
- package/lib/init/template/ai/files/mta.yaml.hbs +1 -1
- package/lib/init/template/ai/index.js +14 -2
- package/lib/init/template/ams/index.js +2 -2
- package/lib/init/template/app-frontend/files/containerize.yaml.hbs +2 -2
- package/lib/init/template/app-frontend/index.js +4 -4
- package/lib/init/template/application-logging/index.js +2 -2
- package/lib/init/template/approuter/files/package.json +1 -1
- package/lib/init/template/approuter/index.js +8 -3
- package/lib/init/template/attachments/files/package.json.hbs +1 -1
- package/lib/init/template/attachments/index.js +2 -2
- package/lib/init/template/audit-logging/index.js +2 -2
- package/lib/init/template/cloud-logging/files/package.json.hbs +4 -4
- package/lib/init/template/cloud-logging/index.js +2 -2
- package/lib/init/template/completion/completionSetup.js +36 -39
- package/lib/init/template/connectivity/index.js +2 -2
- package/lib/init/template/data/as-csv.js +15 -5
- package/lib/init/template/data/as-json.js +114 -42
- package/lib/init/template/data/index.js +16 -2
- package/lib/init/template/destination/index.js +2 -2
- package/lib/init/template/dynatrace/files/package.json.hbs +3 -3
- package/lib/init/template/dynatrace/index.js +2 -2
- package/lib/init/template/enterprise-messaging/index.js +2 -2
- package/lib/init/template/enterprise-messaging-shared/index.js +2 -2
- package/lib/init/template/extensibility/files/mta.yaml.hbs +11 -0
- package/lib/init/template/extensibility/files/xs-security.json.hbs +1 -1
- package/lib/init/template/extensibility/index.js +3 -3
- package/lib/init/template/github-actions/index.js +2 -2
- package/lib/init/template/hana/index.js +3 -2
- package/lib/init/template/hana-serverless/files/db/package.json +14 -0
- package/lib/init/template/hana-serverless/files/identity.values.yaml.hbs +10 -0
- package/lib/init/template/hana-serverless/files/mta.yaml.hbs +64 -0
- package/lib/init/template/hana-serverless/files/package.json.hbs +35 -0
- package/lib/init/template/hana-serverless/files/src/.hdiconfig +139 -0
- package/lib/init/template/hana-serverless/files/undeploy.json +7 -0
- package/lib/init/template/hana-serverless/files/values.yaml.hbs +18 -0
- package/lib/init/template/hana-serverless/index.js +184 -0
- package/lib/init/template/html5-repo/files/containerize.yaml.hbs +2 -2
- package/lib/init/template/html5-repo/files/mta.yaml.hbs +5 -0
- package/lib/init/template/html5-repo/index.js +18 -14
- package/lib/init/template/http/index.js +123 -26
- package/lib/init/template/ias/index.js +2 -2
- package/lib/init/template/kafka/index.js +2 -2
- package/lib/init/template/kyma/index.js +7 -5
- package/lib/init/template/malware-scanner/index.js +2 -2
- package/lib/init/template/mta/files/mta.yaml.hbs +1 -1
- package/lib/init/template/multitenancy/index.js +18 -3
- package/lib/init/template/nodejs/index.js +4 -2
- package/lib/init/template/notifications/index.js +2 -2
- package/lib/init/template/portal/files/mta.yaml.hbs +4 -0
- package/lib/init/template/portal/index.js +13 -8
- package/lib/init/template/postgres/index.js +2 -2
- package/lib/init/template/redis/index.js +2 -2
- package/lib/init/template/sample/files/db/currencies.cds +2 -0
- package/lib/init/template/sample/files/db/data/sap.capire.bookshop-Authors.csv +1 -1
- package/lib/init/template/tiny-sample/files/nodejs/db/data/CatalogService.Books.csv +2 -2
- package/lib/init/template/workzone-standard/index.js +5 -5
- package/lib/init/template/xsuaa/index.js +20 -2
- package/lib/lint/eslintHelp.json +1 -1
- package/lib/mtx/auth_manager.js +103 -37
- package/lib/mtx/params.js +3 -2
- package/lib/mtx/settings_manager.js +45 -28
- package/lib/mtx/tenant_action.js +0 -1
- package/lib/mtx/util/credentials.js +62 -0
- package/node_modules/@cap-js/openapi/lib/compile/csdl.js +3 -3
- package/node_modules/@cap-js/openapi/lib/compile/csdl2openapi.js +111 -103
- package/node_modules/@cap-js/openapi/lib/compile/diagram.js +4 -4
- package/node_modules/@cap-js/openapi/lib/compile/types.d.ts +3 -1
- package/node_modules/@cap-js/openapi/package.json +3 -3
- package/node_modules/@sap/cds/CHANGELOG.md +64 -0
- package/node_modules/@sap/cds/app/index.js +5 -4
- package/node_modules/@sap/cds/eslint.config.mjs +1 -0
- package/node_modules/@sap/cds/lib/compile/for/nodejs.js +1 -0
- package/node_modules/@sap/cds/lib/compile/minify.js +14 -10
- package/node_modules/@sap/cds/lib/env/cds-env.js +1 -1
- package/node_modules/@sap/cds/lib/env/cds-requires.js +22 -11
- package/node_modules/@sap/cds/lib/env/defaults.js +4 -1
- package/node_modules/@sap/cds/lib/env/schemas/cds-rc.js +5 -2
- package/node_modules/@sap/cds/lib/plugins.js +9 -5
- package/node_modules/@sap/cds/lib/req/spawn.js +1 -1
- package/node_modules/@sap/cds/lib/srv/srv-dispatch.js +1 -1
- package/node_modules/@sap/cds/lib/srv/srv-models.js +1 -1
- package/node_modules/@sap/cds/lib/utils/cds-utils.js +2 -1
- package/node_modules/@sap/cds/libx/_runtime/common/generic/assert.js +2 -3
- package/node_modules/@sap/cds/libx/_runtime/common/generic/auth/restrict.js +8 -1
- package/node_modules/@sap/cds/libx/_runtime/common/generic/crud.js +18 -8
- package/node_modules/@sap/cds/libx/_runtime/fiori/lean-draft.js +25 -17
- package/node_modules/@sap/cds/libx/_runtime/messaging/common-utils/authorizedRequest.js +3 -2
- package/node_modules/@sap/cds/libx/_runtime/messaging/enterprise-messaging-utils/registerEndpoints.js +9 -3
- package/node_modules/@sap/cds/libx/_runtime/remote/Service.js +4 -19
- package/node_modules/@sap/cds/libx/_runtime/remote/utils/LruCache.js +42 -0
- package/node_modules/@sap/cds/libx/_runtime/remote/utils/client.js +14 -4
- package/node_modules/@sap/cds/libx/_runtime/remote/utils/cloudSdkProvider.js +2 -9
- package/node_modules/@sap/cds/libx/_runtime/remote/utils/destinationClient.js +150 -0
- package/node_modules/@sap/cds/libx/_runtime/remote/utils/error.js +13 -0
- package/node_modules/@sap/cds/libx/_runtime/remote/utils/fetchClient.js +26 -18
- package/node_modules/@sap/cds/libx/_runtime/remote/utils/query.js +34 -23
- package/node_modules/@sap/cds/libx/_runtime/remote/utils/token.js +82 -0
- package/node_modules/@sap/cds/libx/_runtime/ucl/Service.js +36 -189
- package/node_modules/@sap/cds/libx/common/utils/streaming.js +16 -16
- package/node_modules/@sap/cds/libx/http/location.js +3 -3
- package/node_modules/@sap/cds/libx/odata/middleware/batch.js +16 -10
- package/node_modules/@sap/cds/libx/odata/middleware/metadata.js +9 -6
- package/node_modules/@sap/cds/libx/odata/middleware/service-document.js +1 -1
- package/node_modules/@sap/cds/libx/odata/parse/afterburner.js +19 -3
- package/node_modules/@sap/cds/libx/odata/parse/cqn2odata.js +83 -86
- package/node_modules/@sap/cds/libx/queue/SchedulingService.js +17 -2
- package/node_modules/@sap/cds/libx/queue/processing.js +1 -3
- package/node_modules/@sap/cds/libx/rest/RestAdapter.js +3 -7
- package/node_modules/@sap/cds/libx/rest/middleware/delete.js +3 -3
- package/node_modules/@sap/cds/libx/rest/middleware/parse.js +13 -8
- package/node_modules/@sap/cds/libx/rest/middleware/read.js +3 -3
- package/node_modules/@sap/cds/libx/rest/middleware/upsert.js +2 -2
- package/node_modules/@sap/cds/package.json +1 -1
- package/node_modules/@sap/cds-compiler/CHANGELOG.md +60 -8
- package/node_modules/@sap/cds-compiler/bin/cdsc.js +2 -2
- package/node_modules/@sap/cds-compiler/doc/IncompatibleChanges_v7.md +46 -19
- package/node_modules/@sap/cds-compiler/lib/api/main.js +10 -7
- package/node_modules/@sap/cds-compiler/lib/api/options.js +8 -2
- package/node_modules/@sap/cds-compiler/lib/base/csnRefs.js +5 -2
- package/node_modules/@sap/cds-compiler/lib/base/message-registry.js +4 -0
- package/node_modules/@sap/cds-compiler/lib/base/optionProcessor.js +12 -0
- package/node_modules/@sap/cds-compiler/lib/checks/enricher.js +1 -0
- package/node_modules/@sap/cds-compiler/lib/compiler/assert-consistency.js +8 -7
- package/node_modules/@sap/cds-compiler/lib/compiler/checks.js +3 -3
- package/node_modules/@sap/cds-compiler/lib/compiler/define.js +301 -75
- package/node_modules/@sap/cds-compiler/lib/compiler/dictionaries.js +2 -0
- package/node_modules/@sap/cds-compiler/lib/compiler/extend.js +40 -26
- package/node_modules/@sap/cds-compiler/lib/compiler/populate.js +45 -60
- package/node_modules/@sap/cds-compiler/lib/compiler/propagator.js +16 -7
- package/node_modules/@sap/cds-compiler/lib/compiler/resolve.js +41 -15
- package/node_modules/@sap/cds-compiler/lib/compiler/shared.js +7 -6
- package/node_modules/@sap/cds-compiler/lib/compiler/tweak-assocs.js +62 -50
- package/node_modules/@sap/cds-compiler/lib/compiler/utils.js +29 -14
- package/node_modules/@sap/cds-compiler/lib/edm/edmAnnoPreprocessor.js +6 -5
- package/node_modules/@sap/cds-compiler/lib/gen/CdlGrammar.checksum +1 -1
- package/node_modules/@sap/cds-compiler/lib/gen/CdlParser.js +1119 -1109
- package/node_modules/@sap/cds-compiler/lib/gen/Dictionary.json +19 -3
- package/node_modules/@sap/cds-compiler/lib/json/from-csn.js +10 -16
- package/node_modules/@sap/cds-compiler/lib/json/to-csn.js +58 -39
- package/node_modules/@sap/cds-compiler/lib/main.d.ts +8 -0
- package/node_modules/@sap/cds-compiler/lib/main.js +1 -0
- package/node_modules/@sap/cds-compiler/lib/model/csnUtils.js +2 -0
- package/node_modules/@sap/cds-compiler/lib/parsers/AstBuildingParser.js +2 -1
- package/node_modules/@sap/cds-compiler/lib/parsers/XprTree.js +8 -0
- package/node_modules/@sap/cds-compiler/lib/render/toCdl.js +22 -1
- package/node_modules/@sap/cds-compiler/lib/render/toSql.js +17 -2
- package/node_modules/@sap/cds-compiler/lib/render/utils/common.js +6 -1
- package/node_modules/@sap/cds-compiler/lib/render/utils/operators.js +27 -0
- package/node_modules/@sap/cds-compiler/lib/render/utils/standardDatabaseFunctions.js +125 -3
- package/node_modules/@sap/cds-compiler/lib/tool-lib/revealInternalProperties.js +2 -1
- package/node_modules/@sap/cds-compiler/lib/transform/db/applyTransformations.js +3 -0
- package/node_modules/@sap/cds-compiler/lib/transform/db/associations.js +8 -2
- package/node_modules/@sap/cds-compiler/lib/transform/db/backlinks.js +22 -6
- package/node_modules/@sap/cds-compiler/lib/transform/db/constraints.js +62 -1
- package/node_modules/@sap/cds-compiler/lib/transform/effective/annotations.js +40 -0
- package/node_modules/@sap/cds-compiler/lib/transform/effective/main.js +1 -0
- package/node_modules/@sap/cds-compiler/lib/transform/forRelationalDB.js +6 -1
- package/node_modules/@sap/cds-compiler/lib/transform/translateAssocsToJoins.js +19 -8
- package/node_modules/@sap/cds-compiler/package.json +1 -1
- package/node_modules/@sap/cds-mtxs/CHANGELOG.md +51 -0
- package/node_modules/@sap/cds-mtxs/bin/cds-mtx-migrate.js +32 -48
- package/node_modules/@sap/cds-mtxs/bin/cds-mtx.js +35 -16
- package/node_modules/@sap/cds-mtxs/cds-plugin.js +18 -0
- package/node_modules/@sap/cds-mtxs/lib/migration/migration.js +3 -408
- package/node_modules/@sap/cds-mtxs/lib/utils.js +19 -4
- package/node_modules/@sap/cds-mtxs/package.json +1 -1
- package/node_modules/@sap/cds-mtxs/srv/cf/abstract-provisioning-service.js +6 -7
- package/node_modules/@sap/cds-mtxs/srv/extensibility/linter/annotations.js +5 -2
- package/node_modules/@sap/cds-mtxs/srv/extensibility/linter/index.js +6 -5
- package/node_modules/@sap/cds-mtxs/srv/extensibility-service.cds +0 -11
- package/node_modules/@sap/cds-mtxs/srv/extensibility-service.js +34 -35
- package/node_modules/@sap/cds-mtxs/srv/jobs-service.js +30 -24
- package/node_modules/@sap/cds-mtxs/srv/model-provider.js +19 -4
- package/node_modules/@sap/cds-mtxs/srv/plugins/hana/ctnr-mgr-base.js +6 -3
- package/node_modules/@sap/cds-mtxs/srv/plugins/hana/hdi.js +5 -3
- package/node_modules/@sap/cds-mtxs/srv/plugins/hana/srv-mgr.js +3 -2
- package/node_modules/@sap/cds-mtxs/srv/plugins/hana/tms.js +17 -0
- package/node_modules/@sap/cds-mtxs/srv/plugins/hana.js +18 -21
- package/node_modules/@sap/xsenv/CHANGELOG.md +7 -0
- package/node_modules/@sap/xsenv/package.json +10 -7
- package/node_modules/body-parser/node_modules/content-type/README.md +2 -0
- package/node_modules/body-parser/node_modules/content-type/dist/index.d.ts +20 -0
- package/node_modules/body-parser/node_modules/content-type/dist/index.js +20 -14
- package/node_modules/body-parser/node_modules/content-type/dist/index.js.map +1 -1
- package/node_modules/body-parser/node_modules/content-type/package.json +1 -1
- package/node_modules/hdb/cfg/VERSION +1 -1
- package/node_modules/hdb/lib/protocol/ClientInfo.js +16 -3
- package/node_modules/hdb/lib/protocol/Connection.js +1 -0
- package/node_modules/hdb/package.json +3 -2
- package/node_modules/negotiator/lib/accept.js +54 -0
- package/node_modules/negotiator/lib/charset.js +10 -34
- package/node_modules/negotiator/lib/encoding.js +9 -30
- package/node_modules/negotiator/lib/language.js +15 -36
- package/node_modules/negotiator/lib/mediaType.js +16 -134
- package/node_modules/negotiator/node_modules/content-type/LICENSE +22 -0
- package/node_modules/negotiator/node_modules/content-type/README.md +71 -0
- package/node_modules/negotiator/node_modules/content-type/dist/index.d.ts +46 -0
- package/node_modules/negotiator/node_modules/content-type/dist/index.js +176 -0
- package/node_modules/negotiator/node_modules/content-type/dist/index.js.map +1 -0
- package/node_modules/negotiator/node_modules/content-type/package.json +52 -0
- package/node_modules/negotiator/package.json +16 -10
- package/node_modules/qs/.github/THREAT_MODEL.md +3 -3
- package/node_modules/qs/CHANGELOG.md +15 -0
- package/node_modules/qs/README.md +19 -1
- package/node_modules/qs/dist/qs.js +21 -21
- package/node_modules/qs/eslint.config.mjs +1 -1
- package/node_modules/qs/lib/parse.js +3 -4
- package/node_modules/qs/lib/stringify.js +23 -8
- package/node_modules/qs/lib/utils.js +10 -3
- package/node_modules/qs/package.json +4 -4
- package/node_modules/qs/test/parse.js +192 -3
- package/node_modules/qs/test/stringify.js +317 -0
- package/node_modules/qs/test/utils.js +12 -0
- package/node_modules/sax/lib/sax.js +27 -9
- package/node_modules/sax/package.json +1 -1
- package/node_modules/type-is/node_modules/content-type/README.md +2 -0
- package/node_modules/type-is/node_modules/content-type/dist/index.d.ts +20 -0
- package/node_modules/type-is/node_modules/content-type/dist/index.js +20 -14
- package/node_modules/type-is/node_modules/content-type/dist/index.js.map +1 -1
- package/node_modules/type-is/node_modules/content-type/package.json +1 -1
- package/node_modules/ws/lib/permessage-deflate.js +3 -1
- package/node_modules/ws/package.json +1 -1
- package/package.json +5 -5
- package/bin/completion/scripts/cds-bash.sh +0 -20
- package/bin/completion/scripts/cds-fish.fish +0 -13
- package/bin/completion/scripts/cds-ps.ps1 +0 -19
- package/bin/completion/scripts/cds-zsh.sh +0 -13
- package/lib/deploy/index.js +0 -25
- package/lib/import/asyncapi/importAsyncAPI.js +0 -33
- package/lib/import/asyncapi/index.js +0 -18
- package/lib/import/asyncapi/parserContext.js +0 -372
- package/lib/import/asyncapi/utils.js +0 -49
- package/lib/init/template/nodejs/files/.gitignore.hbs +0 -34
- package/node_modules/@sap/cds/libx/_runtime/ucl/queries.js +0 -61
- package/node_modules/@sap/cds-mtxs/lib/migration/extension-project-builder.js +0 -129
- package/node_modules/@sap/cds-mtxs/lib/migration/extension-project.js +0 -89
- package/node_modules/@sap/cds-mtxs/lib/migration/mtx-adapter.js +0 -230
- package/node_modules/negotiator/HISTORY.md +0 -114
- /package/{lib → bin}/upgrade/context.js +0 -0
- /package/{lib → bin}/upgrade/migrations/cds10/migrations.json +0 -0
- /package/{lib → bin}/upgrade/preflight/cds-version.js +0 -0
- /package/{lib → bin}/upgrade/preflight/project-type.js +0 -0
- /package/{lib → bin}/upgrade/steps/analyze/classification.js +0 -0
- /package/{lib → bin}/upgrade/steps/analyze/detector.js +0 -0
- /package/{lib → bin}/upgrade/steps/analyze/evaluator.js +0 -0
- /package/{lib → bin}/upgrade/steps/analyze/reporter.js +0 -0
- /package/{lib → bin}/upgrade/steps/analyze/setup.js +0 -0
- /package/{lib → bin}/upgrade/steps/analyze/utils/detection.js +0 -0
- /package/{lib → bin}/upgrade/steps/analyze/utils/files.js +0 -0
- /package/{lib → bin}/upgrade/steps/analyze/utils/grep.js +0 -0
- /package/{lib → bin}/upgrade/steps/analyze/utils/yaml.js +0 -0
- /package/{lib → bin}/upgrade/util/workspaces.js +0 -0
- /package/{lib → bin}/watch/esm-resolve-registration.js +0 -0
- /package/{lib → bin}/watch/livereload-server.js +0 -0
- /package/{lib → bin}/watch/node-watch.js +0 -0
- /package/{lib → bin}/watch/open.js +0 -0
- /package/{lib → bin}/watch/watcher.js +0 -0
|
@@ -6,7 +6,7 @@ const { isIdentifier, nameParts } = require('./csdl');
|
|
|
6
6
|
|
|
7
7
|
/**
|
|
8
8
|
* Diagram representation of property cardinality
|
|
9
|
-
* @param {
|
|
9
|
+
* @param {*} typedElement Typed model element, e.g. property
|
|
10
10
|
* @return {string} cardinality
|
|
11
11
|
*/
|
|
12
12
|
function cardinality(typedElement) {
|
|
@@ -14,7 +14,7 @@ function cardinality(typedElement) {
|
|
|
14
14
|
}
|
|
15
15
|
|
|
16
16
|
class Diagram {
|
|
17
|
-
/** @type {
|
|
17
|
+
/** @type {*} */
|
|
18
18
|
#meta
|
|
19
19
|
#comma = ''
|
|
20
20
|
// TODO: make colors configurable
|
|
@@ -26,7 +26,7 @@ class Diagram {
|
|
|
26
26
|
|
|
27
27
|
/**
|
|
28
28
|
* Construct resource diagram using web service at https://yuml.me
|
|
29
|
-
* @param {
|
|
29
|
+
* @param {*} entityContainer Entity Container object
|
|
30
30
|
* @return {string} resource diagram
|
|
31
31
|
*/
|
|
32
32
|
getResourceDiagram(entityContainer) {
|
|
@@ -86,7 +86,7 @@ class Diagram {
|
|
|
86
86
|
/**
|
|
87
87
|
* Diagram representation of action or function overload
|
|
88
88
|
* @param {string} name Name of action or function import
|
|
89
|
-
* @param {
|
|
89
|
+
* @param {*} overload Action or function overload
|
|
90
90
|
* @return diagram part
|
|
91
91
|
*/
|
|
92
92
|
#overloadDiagram(name, overload) {
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@cap-js/openapi",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.6.0",
|
|
4
4
|
"description": "CAP tool for OpenAPI",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -36,9 +36,9 @@
|
|
|
36
36
|
},
|
|
37
37
|
"devDependencies": {
|
|
38
38
|
"@mermaid-js/mermaid-cli": "^11.12.0",
|
|
39
|
-
"@types/node": "^
|
|
39
|
+
"@types/node": "^26.1.1",
|
|
40
40
|
"eslint": "^10.4.1",
|
|
41
41
|
"globals": "^17.6.0",
|
|
42
|
-
"typescript": "^
|
|
42
|
+
"typescript": "^7.0.2"
|
|
43
43
|
}
|
|
44
44
|
}
|
|
@@ -4,6 +4,56 @@
|
|
|
4
4
|
- The format is based on [Keep a Changelog](https://keepachangelog.com/).
|
|
5
5
|
- This project adheres to [Semantic Versioning](https://semver.org/).
|
|
6
6
|
|
|
7
|
+
## Version 10.1.0 - 2026-09-02
|
|
8
|
+
|
|
9
|
+
### Added
|
|
10
|
+
|
|
11
|
+
- New `sqlite:memory` preset for `cds.requires.db` runs an in-memory SQLite database, now also in production
|
|
12
|
+
- New `hana-serverless` kind for `cds.requires.db` connects to a HANA Cloud serverless instance (Beta)
|
|
13
|
+
- Node.js-native `fetch` client now resolves named destinations through the SAP BTP Destination service for `NoAuthentication`, `BasicAuthentication`, and `OAuth2ClientCredentials` (proxy type `Internet` only) (beta)
|
|
14
|
+
|
|
15
|
+
### Changed
|
|
16
|
+
|
|
17
|
+
- `cds.spawn` uses dedicated, short-lived transaction for fetching extended models
|
|
18
|
+
- Messaging webhook endpoints are no longer registered anonymously in production when neither `cds.requires.auth` nor `cds.requires.messaging.xsuaa` is configured.
|
|
19
|
+
- UCL tenant mapping notification handlers will be scheduled as `tenant: receiverTenant` instead of anonymously
|
|
20
|
+
|
|
21
|
+
### Fixed
|
|
22
|
+
|
|
23
|
+
- `@assert` messages using `{i18n>...}` placeholders are no longer mistaken for structured `error(...)` results
|
|
24
|
+
- JSON `$batch` requests now reject invalid `atomicityGroup` identifiers
|
|
25
|
+
- Scheduling a task via `srv.schedule(...).after(<delay>)` or `.every(<interval>)` with a delay above Node's 32-bit `setTimeout` limit (~24.8 days, e.g. `.after('30d')`) no longer emits a `TimeoutOverflowWarning` or fires almost immediately. Such delays are now armed as chained timers, so the task still fires at its exact scheduled time.
|
|
26
|
+
- OData requests with unknown key names in the key predicate (e.g. `Books(ID=1,sad=2)`) are now rejected with `400 Bad Request` instead of causing a `500` error
|
|
27
|
+
- `cds-rc.js` schema now has a `$id` so `jsonschema` 1.5 resolves internal `$ref`s correctly
|
|
28
|
+
- REST `HEAD` responses now report byte-accurate `Content-Length` headers for Unicode JSON payloads
|
|
29
|
+
- Query properties like `limit` and `recurse` are no longer lost when forwarded to remote services
|
|
30
|
+
- `cds.requires.<name>.service = <name>` (a required service naming itself) no longer fails with a spurious `conflicts with` error on server start
|
|
31
|
+
- `UPDATE` and `DELETE` remote-service-queries, that use `.where` instead of a key to specify their subject, will throw
|
|
32
|
+
- Navigating to or creating under a parent protected by an instance-based `@restrict.where` now returns `404` when the parent is not readable
|
|
33
|
+
- A static `@restrict.where` on a collection-bound action is now enforced, rejecting callers who do not satisfy the condition — previously it was silently ignored
|
|
34
|
+
|
|
35
|
+
### Removed
|
|
36
|
+
|
|
37
|
+
- UCL GraphQL interface adapter as dead code after UCL deprecated the GraphQL on-boarding flow
|
|
38
|
+
|
|
39
|
+
## Version 10.0.6 - 2026-08-18
|
|
40
|
+
|
|
41
|
+
### Fixed
|
|
42
|
+
|
|
43
|
+
- `$apply=filter(...)/groupby(...)/aggregate($count)` with non-UTC `DateTimeOffset` filter values now returns correct results on HANA
|
|
44
|
+
- Generated index page now uses relative hrefs, fixing links when served behind an approuter with a path prefix
|
|
45
|
+
- `$batch` sub-requests returned an empty body and headers when `@opentelemetry/instrumentation-express` (or any instrumentation that wraps Express handlers to arity 2) was active
|
|
46
|
+
- `cds.xt.ModelProviderService` can be served in mtx sidecar
|
|
47
|
+
- Modeled service events were not properly ignored in OData adapter
|
|
48
|
+
- Generic handler for draft-specific actions not correctly being bound to the transaction context
|
|
49
|
+
|
|
50
|
+
## Version 10.0.5 - 2026-07-28
|
|
51
|
+
|
|
52
|
+
### Fixed
|
|
53
|
+
|
|
54
|
+
- Messaging management requests to SAP Event Mesh or Event Mesh in SAP Integration Suite (EMIS) now always send a (possibly empty) body for `PUT`/`POST` requests, as required by EMIS (and compatible with SAP Event Mesh)
|
|
55
|
+
- Only convert `@Common.Text` to `@cds.search` for service entities
|
|
56
|
+
|
|
7
57
|
## Version 10.0.4 - 2026-07-21
|
|
8
58
|
|
|
9
59
|
### Fixed
|
|
@@ -136,6 +186,20 @@
|
|
|
136
186
|
- Internal `_initial` phase
|
|
137
187
|
- Removed support for `async activate()` functions returned from `cds-plugin.js` modules, which was never documented, and deprecated since Oct 2023. If you need to run async code during plugin loading, just return a promise as default export.
|
|
138
188
|
|
|
189
|
+
## Version 9.9.3 - 2026-07-21
|
|
190
|
+
|
|
191
|
+
### Fixed
|
|
192
|
+
|
|
193
|
+
- Fixed context propagation for local app and remote service calls
|
|
194
|
+
|
|
195
|
+
## Version 9.9.2 - 2026-06-29
|
|
196
|
+
|
|
197
|
+
### Fixed
|
|
198
|
+
|
|
199
|
+
- `srv.model` propagation in extensibility scenarios
|
|
200
|
+
- Restored `err.target:'in'` during draft activation with `cds.fiori.draft_messages=false` to avoid the `MULTIPLE_ERRORS` popup
|
|
201
|
+
- `resolveView` prioritizes the original foreign key `parent_ID` if exposed multiple times, e.g., through `*, parent.ID as parentId`
|
|
202
|
+
|
|
139
203
|
## Version 9.9.1 - 2026-04-29
|
|
140
204
|
|
|
141
205
|
### Fixed
|
|
@@ -2,7 +2,8 @@ const cds = require('../lib')
|
|
|
2
2
|
const { find, path, fs } = cds.utils
|
|
3
3
|
|
|
4
4
|
const odata = endpoint => endpoint.kind.startsWith('odata')
|
|
5
|
-
const
|
|
5
|
+
const rel = path => path.replace(/^\//, '')
|
|
6
|
+
const metadata = endpoint => odata(endpoint) ? `<span>/</span> <a href="${rel(endpoint.path)}/$metadata"><span>$metadata</span></a>` : ``
|
|
6
7
|
const asHtmlId = s => s.replace(/[.:/$&?@]/g, '_').toLowerCase()
|
|
7
8
|
|
|
8
9
|
module.exports = { get html(){
|
|
@@ -22,12 +23,12 @@ module.exports = { get html(){
|
|
|
22
23
|
.map (({srv, endpoint}) => `
|
|
23
24
|
<div id="${asHtmlId(srv.name)}-${endpoint.kind}">
|
|
24
25
|
<h3 class="header">
|
|
25
|
-
<a href="${endpoint.path}"><span>${endpoint.path}</span></a>${metadata(endpoint)} ${_moreLinks(srv, endpoint, undefined, false)}
|
|
26
|
+
<a href="${rel(endpoint.path)}"><span>${endpoint.path}</span></a>${metadata(endpoint)} ${_moreLinks(srv, endpoint, undefined, false)}
|
|
26
27
|
</h3>
|
|
27
28
|
<ul>${_entities_in(srv).map (e => `
|
|
28
29
|
<li id="${asHtmlId(srv.name)}-${endpoint.kind}-${asHtmlId(e)}">
|
|
29
30
|
<div>
|
|
30
|
-
<a href="${endpoint.path}/${e.replace(/\./g, '_')}"><span>${e}</span></a>
|
|
31
|
+
<a href="${rel(endpoint.path)}/${e.replace(/\./g, '_')}"><span>${e}</span></a>
|
|
31
32
|
</div>
|
|
32
33
|
${_moreLinks(srv, endpoint, e)}
|
|
33
34
|
</li>`).join('')}
|
|
@@ -35,7 +36,7 @@ module.exports = { get html(){
|
|
|
35
36
|
<ul>${_operations_in(srv).map (e => `
|
|
36
37
|
<li id="${asHtmlId(srv.name)}-${endpoint.kind}-${asHtmlId(e.name)}" class="operation">
|
|
37
38
|
<div>
|
|
38
|
-
<a href="${endpoint.path}/${e.name}" title="${endpoint.path}/${e.name}"><span>${e.name} ${e.params}</span></a>
|
|
39
|
+
<a href="${rel(endpoint.path)}/${e.name}" title="${endpoint.path}/${e.name}"><span>${e.name} ${e.params}</span></a>
|
|
39
40
|
</div>
|
|
40
41
|
</li>`).join('')}
|
|
41
42
|
</ul>
|
|
@@ -13,6 +13,7 @@ function _compile_for_nodejs (csn, o) {
|
|
|
13
13
|
// @Common.Text → @cds.search
|
|
14
14
|
text_to_search: for (const name in dsn.definitions) {
|
|
15
15
|
const def = dsn.definitions[name]
|
|
16
|
+
if (!def._service) continue
|
|
16
17
|
if (!def.associations) continue
|
|
17
18
|
|
|
18
19
|
// if any @cds.search.* === true, @Common.Text should be ignored
|
|
@@ -17,7 +17,7 @@ class Minifier {
|
|
|
17
17
|
if (skip_unused === 'services') o.services = 'all'
|
|
18
18
|
const all = new Map (Object.entries( this.defs ??= csn.definitions || {} ))
|
|
19
19
|
const children = (n,fn,pre=n+'.') => { for (let [n,d] of all) if (n.startsWith(pre)) fn (n,d) }
|
|
20
|
-
const
|
|
20
|
+
const _keep = (d,kinds) => d.kind in kinds || d['@cds.minify'] === false
|
|
21
21
|
const _own = o.keep ??= { entity:1, type:1, event:1, action:1, function:1 }
|
|
22
22
|
const _ext = { event:1, action:1, function:1 }
|
|
23
23
|
const kept = this.kept = csn.definitions = {}
|
|
@@ -31,16 +31,23 @@ class Minifier {
|
|
|
31
31
|
}
|
|
32
32
|
} else {
|
|
33
33
|
// Otherwise first mark all external services and their children as initially skipped
|
|
34
|
-
for (let [s,d] of all) if (d.kind === 'service' &&
|
|
35
|
-
|
|
34
|
+
for (let [s,d] of all) if (d.kind === 'service' && d['@cds.external'] >= 2) {
|
|
35
|
+
if (d['@cds.minify'] === false) continue
|
|
36
|
+
else skipped[s] = 0
|
|
37
|
+
children (s, (c,d) => _keep(d,_ext) ? this.keep(c,d,s) : skipped[c] = s) // used later on in this.keep()
|
|
36
38
|
}
|
|
37
39
|
// Then keep all own services and their children
|
|
38
|
-
for (let [s,d] of all) if (d.kind === 'service'
|
|
39
|
-
|
|
40
|
+
for (let [s,d] of all) if (d.kind === 'service') {
|
|
41
|
+
if (s in skipped) continue
|
|
42
|
+
else this.keep(s,d)
|
|
43
|
+
children (s, (c,d) => _keep(d,_own) ? this.keep(c,d) : skipped[c] = 0)
|
|
40
44
|
}
|
|
41
45
|
// Also keep remaining non-service entities
|
|
42
|
-
for (let [e,d] of all) if (d.kind === 'entity' ||
|
|
43
|
-
e in
|
|
46
|
+
for (let [e,d] of all) if (d.kind === 'entity' || d['@cds.minify'] === false) {
|
|
47
|
+
if (e in skipped || e in kept) continue //> skip already kept or skipped definitions
|
|
48
|
+
if (d['@cds.persistence.skip'] === 'if-unused') continue //> skip initially, they are kept by reference if used
|
|
49
|
+
if (e.endsWith('.texts')) continue //> skip texts entities, they are kept by reference if used
|
|
50
|
+
else this.keep(e,d)
|
|
44
51
|
}
|
|
45
52
|
}
|
|
46
53
|
|
|
@@ -106,7 +113,4 @@ class Minifier {
|
|
|
106
113
|
|
|
107
114
|
}
|
|
108
115
|
|
|
109
|
-
const _skip_service = (s,d) => (d['@cds.external'] >= 2) && _can_minify(d)
|
|
110
|
-
const _skip_entity = (e,d) => (d['@cds.external'] >= 2 || d['@cds.persistence.skip'] === 'if-unused') && _can_minify(d) || e.endsWith('.texts')
|
|
111
|
-
const _can_minify = d => d['@cds.minify'] !== false
|
|
112
116
|
exports.Minifier = Minifier
|
|
@@ -524,7 +524,7 @@ function _merge (dst, src, _profiles) {
|
|
|
524
524
|
}
|
|
525
525
|
else if (v !== undefined) dst[p] = v
|
|
526
526
|
}
|
|
527
|
-
if (profiled.length >
|
|
527
|
+
if (profiled.length > 1 && !_profiles.has('production')) {
|
|
528
528
|
const profiles = Array.from(_profiles)
|
|
529
529
|
profiled.sort((a,b) => profiles.indexOf(b.profile) - profiles.indexOf(a.profile))
|
|
530
530
|
}
|
|
@@ -24,7 +24,8 @@ exports = module.exports = {
|
|
|
24
24
|
_resolved() {
|
|
25
25
|
const requires = { __proto__: this }
|
|
26
26
|
for (let [name,e] of Object.entries(this)) if (e.service) {
|
|
27
|
-
if (
|
|
27
|
+
if (e.service === name) continue
|
|
28
|
+
if (!(e.service in requires) || e.override) requires[e.service] = { ...e, name }
|
|
28
29
|
else throw new Error (`Config 'cds.requires.${name}.service = ${e.service}' conflicts with 'cds.requires.${e.service}'`)
|
|
29
30
|
}
|
|
30
31
|
return requires
|
|
@@ -127,9 +128,10 @@ const _db_data = {
|
|
|
127
128
|
|
|
128
129
|
const _databases = {
|
|
129
130
|
|
|
130
|
-
"db-defaults": { kind: 'sql', ..._db_data }, //> applied only for cds.requires.db: true
|
|
131
|
-
|
|
131
|
+
"db-defaults": { kind: 'sql', ..._db_data }, //> applied only for cds.requires.db: true
|
|
132
|
+
|
|
132
133
|
"sql": {
|
|
134
|
+
// REVISIT: should be '[development]': { kind: 'sqlite:memory' },
|
|
133
135
|
'[development]': { kind: 'sqlite', credentials: { url: ':memory:' } },
|
|
134
136
|
'[production]': { kind: 'hana' },
|
|
135
137
|
},
|
|
@@ -138,22 +140,33 @@ const _databases = {
|
|
|
138
140
|
impl: '@cap-js/sqlite', credentials: { url: 'db.sqlite' },
|
|
139
141
|
..._db_data,
|
|
140
142
|
},
|
|
143
|
+
"sqlite:memory": {
|
|
144
|
+
kind: 'sqlite', credentials: { url: ':memory:' },
|
|
145
|
+
},
|
|
141
146
|
"hana": {
|
|
142
147
|
impl: '@cap-js/hana',
|
|
143
148
|
..._db_data,
|
|
144
149
|
},
|
|
145
150
|
"hana-cloud": {
|
|
146
|
-
kind: 'hana',
|
|
151
|
+
kind: 'hana',
|
|
152
|
+
"deploy-format": "hdbtable", //> REVISIT: still needed?
|
|
153
|
+
},
|
|
154
|
+
"hana-serverless": {
|
|
155
|
+
kind: 'hana',
|
|
156
|
+
serverless: true,
|
|
157
|
+
vcap: { label: 'hana-cloud', plan: 'serverless' },
|
|
158
|
+
dialect: "hana", //> REVISIT: why needed?
|
|
159
|
+
"deploy-format": "hdbtable", //> REVISIT: still needed?
|
|
147
160
|
},
|
|
161
|
+
|
|
148
162
|
"sql-mt": { // For compatibility only
|
|
149
163
|
'[development]': { kind: 'sqlite' },
|
|
150
164
|
'[production]': { kind: 'hana-mt' },
|
|
151
165
|
},
|
|
152
166
|
"hana-mt": { // For compatibility only
|
|
153
|
-
kind: 'hana',
|
|
154
|
-
"vcap": {
|
|
155
|
-
|
|
156
|
-
}
|
|
167
|
+
kind: 'hana',
|
|
168
|
+
"vcap": { "label": "service-manager" },
|
|
169
|
+
"deploy-format": "hdbtable", //> REVISIT: still needed?
|
|
157
170
|
},
|
|
158
171
|
}
|
|
159
172
|
|
|
@@ -277,12 +290,10 @@ const _messaging = {
|
|
|
277
290
|
const _platform_services = {
|
|
278
291
|
|
|
279
292
|
ucl: {
|
|
280
|
-
model: '@sap/cds/srv/ucl-service.cds'
|
|
293
|
+
model: '@sap/cds/srv/ucl-service.cds'
|
|
281
294
|
// REVISIT: how to configure such that a cds.connect.to('ucl') returns the already initialized UCLService?
|
|
282
295
|
// service: 'UCLService',
|
|
283
296
|
// impl: `${_runtime}/ucl/Service.js`,
|
|
284
|
-
// REVISIT: remove default as only needed for push mode
|
|
285
|
-
vcap: { label: 'xsuaa' }
|
|
286
297
|
},
|
|
287
298
|
|
|
288
299
|
destinations: {
|
|
@@ -35,11 +35,11 @@ module.exports = exports = {
|
|
|
35
35
|
sql_simple_queries: 0,
|
|
36
36
|
pre_compile_edmxs: false,
|
|
37
37
|
live_reload: !production,
|
|
38
|
-
in_memory_db: !production,
|
|
39
38
|
test_data: !production,
|
|
40
39
|
test_mocks: !production,
|
|
41
40
|
with_mocks: !production,
|
|
42
41
|
mocked_bindings: !production,
|
|
42
|
+
in_memory_db: true,
|
|
43
43
|
// skip_unused: 'all',
|
|
44
44
|
skip_unused: true,
|
|
45
45
|
deploy_data_onconflict: 'insert',
|
|
@@ -223,6 +223,9 @@ module.exports = exports = {
|
|
|
223
223
|
|
|
224
224
|
remote: {
|
|
225
225
|
native_fetch: undefined,
|
|
226
|
+
timeout: '10s',
|
|
227
|
+
cache_size: 0,
|
|
228
|
+
cache_expiry_buffer: '5min',
|
|
226
229
|
},
|
|
227
230
|
|
|
228
231
|
}
|
|
@@ -3,6 +3,7 @@ const cds = require('../../index')
|
|
|
3
3
|
module.exports = {
|
|
4
4
|
_version: cds.version,
|
|
5
5
|
|
|
6
|
+
$id: 'cdsjsonschema://schemas/cds-rc.json',
|
|
6
7
|
title: 'JSON schema for CDS configuration',
|
|
7
8
|
$schema: 'https://json-schema.org/draft-07/schema',
|
|
8
9
|
description: 'This is a JSON schema representation for CDS project configuration',
|
|
@@ -961,12 +962,14 @@ module.exports = {
|
|
|
961
962
|
enum: [
|
|
962
963
|
'hana',
|
|
963
964
|
'sql',
|
|
964
|
-
'sqlite'
|
|
965
|
+
'sqlite',
|
|
966
|
+
'sqlite:memory'
|
|
965
967
|
],
|
|
966
968
|
enumDescriptions: [
|
|
967
969
|
'SAP HANA',
|
|
968
970
|
'In-memory SQLite (development), SAP HANA (production)',
|
|
969
|
-
'File-based SQLite'
|
|
971
|
+
'File-based SQLite',
|
|
972
|
+
'In-memory SQLite'
|
|
970
973
|
]
|
|
971
974
|
},
|
|
972
975
|
|
|
@@ -1,6 +1,12 @@
|
|
|
1
1
|
const DEBUG = /\b(y|all|plugins)\b/.test(process.env.DEBUG) ? console : undefined // eslint-disable-line no-console
|
|
2
2
|
const cds = require('.')
|
|
3
3
|
|
|
4
|
+
const prioritized = {
|
|
5
|
+
'@sap/cds-mtxs': true, // plugins may register handlers for mtxs services
|
|
6
|
+
'@cap-js/sqlite': true, // to enable override by @cap-js/ai
|
|
7
|
+
'@cap-js/telemetry': true // to allow better instrumentation
|
|
8
|
+
}
|
|
9
|
+
|
|
4
10
|
/**
|
|
5
11
|
* Fetch cds-plugins from project's package dependencies.
|
|
6
12
|
* Called in cds.env to populate the plugins configuration
|
|
@@ -8,7 +14,7 @@ const cds = require('.')
|
|
|
8
14
|
*/
|
|
9
15
|
exports.fetch = function (DEV = process.env.NODE_ENV !== 'production') {
|
|
10
16
|
DEBUG?.time ('[cds.plugins] - fetched plugins in')
|
|
11
|
-
|
|
17
|
+
let plugins = JSON.parse(process.env.CDS_PLUGINS||'{}')
|
|
12
18
|
fetch_plugins_in (cds.home, false)
|
|
13
19
|
fetch_plugins_in (cds.root, DEV)
|
|
14
20
|
function fetch_plugins_in (root, dev) {
|
|
@@ -19,6 +25,8 @@ exports.fetch = function (DEV = process.env.NODE_ENV !== 'production') {
|
|
|
19
25
|
plugins[each] = { impl }
|
|
20
26
|
} catch { /* no cds-plugin.js */ }
|
|
21
27
|
}
|
|
28
|
+
for (const each in prioritized)
|
|
29
|
+
if (each in plugins) plugins = Object.assign({ [each]: plugins[each] }, plugins)
|
|
22
30
|
DEBUG?.timeEnd ('[cds.plugins] - fetched plugins in')
|
|
23
31
|
return plugins
|
|
24
32
|
}
|
|
@@ -30,10 +38,6 @@ exports.fetch = function (DEV = process.env.NODE_ENV !== 'production') {
|
|
|
30
38
|
exports.activate = async function (plugins = cds.env?.plugins || exports.fetch()) {
|
|
31
39
|
DEBUG?.time ('[cds.plugins] - loaded plugins in')
|
|
32
40
|
const all = Object.entries(plugins), { local } = cds.utils
|
|
33
|
-
const prioritized = {
|
|
34
|
-
'@sap/cds-mtxs': true, // plugins may register handlers for mtxs services
|
|
35
|
-
'@cap-js/telemetry': true // to allow better instrumentation
|
|
36
|
-
}
|
|
37
41
|
await Promise.all (all.map (([n,c]) => n in prioritized && _load(n,c)))
|
|
38
42
|
await Promise.all (all.map (([n,c]) => n in prioritized || _load(n,c)))
|
|
39
43
|
async function _load (plugin, conf) {
|
|
@@ -12,7 +12,7 @@ module.exports = function spawn (o, fn, /** @type {import('../index')} */ cds=th
|
|
|
12
12
|
if (cds.model && (cds.env.requires.extensibility || cds.env.requires.toggles)) {
|
|
13
13
|
const ctx = cds.context
|
|
14
14
|
const ExtendedModels = require('../srv/srv-models') // the sentinel is automatically started when required
|
|
15
|
-
cds.context.model = await ExtendedModels.model4(ctx.tenant, ctx.features)
|
|
15
|
+
cds.context.model = await cds.tx(() => ExtendedModels.model4(ctx.tenant, ctx.features))
|
|
16
16
|
tx.model = cds.context.model
|
|
17
17
|
}
|
|
18
18
|
return Promise.resolve(fn(tx))
|
|
@@ -113,5 +113,5 @@ const _ensure_fqn = (x,p,srv, name = x[p]) => {
|
|
|
113
113
|
|
|
114
114
|
const _unhandled = (srv,req) => {
|
|
115
115
|
const event = req.event + (req.path ? ' ' + req.path : '')
|
|
116
|
-
|
|
116
|
+
cds.error (501, `Service "${srv.name}" has no handler for "${event}".`)
|
|
117
117
|
}
|
|
@@ -148,7 +148,7 @@ if (!extensibility) {
|
|
|
148
148
|
// helper to get model for tenant/features
|
|
149
149
|
const _is_extended = extensibility ? ()=> cds.db.exists('cds.xt.Extensions') : ()=> false
|
|
150
150
|
const _get_model4 = async (tenant, features) => {
|
|
151
|
-
const
|
|
151
|
+
const mps = await cds.connect.to('cds.xt.ModelProviderService')
|
|
152
152
|
const csn = await mps.getCsn (tenant, features)
|
|
153
153
|
const nsn = cds.compile.for.nodejs(csn)
|
|
154
154
|
if (cds.edmxs) await cds.compile.to.edmx.files ( csn,
|
|
@@ -389,7 +389,8 @@ exports.sh = function shell (cmd,..._) {
|
|
|
389
389
|
*/
|
|
390
390
|
const ms4 = exports.ms4 = (ts, unit, u=unit) => {
|
|
391
391
|
if (typeof ts === 'string') [,ts,u] = /(\d+) ?(\w*)/.exec(ts) || cds.error `Invalid time span format: ${ts}`
|
|
392
|
-
|
|
392
|
+
const factor = ms4[u||unit||'ms'] || cds.error `Invalid time span unit: ${unit} in ${ts}`
|
|
393
|
+
return ts * factor
|
|
393
394
|
}
|
|
394
395
|
|
|
395
396
|
/**
|
|
@@ -132,9 +132,8 @@ module.exports = cds.service.impl(function () {
|
|
|
132
132
|
// If error function was used in @assert expression -> use its output
|
|
133
133
|
// Note: depending on DB, function result may be JavaScript object or JSON string
|
|
134
134
|
if (typeof message === 'string') {
|
|
135
|
-
if (message[0]
|
|
136
|
-
|
|
137
|
-
else return error //> it's a plain message string
|
|
135
|
+
if (message[0] !== '{' || message.startsWith('{i18n>')) return error //> it's a plain message string
|
|
136
|
+
message = JSON.parse(message) //> it's an error function result
|
|
138
137
|
}
|
|
139
138
|
let { targets = [], ...details } = message
|
|
140
139
|
if (targets.length) details.target = targets.shift()
|
|
@@ -238,7 +238,14 @@ async function enforce_auth(req) {
|
|
|
238
238
|
// REVISIT with cds^11
|
|
239
239
|
// - remove compat_static_auth
|
|
240
240
|
// - make check on CREATE/ NEW and unbound a compat opt-in
|
|
241
|
-
|
|
241
|
+
const boundAction = req.target?.actions?.[req.event]
|
|
242
|
+
if (
|
|
243
|
+
cds.env.features.compat_static_auth ||
|
|
244
|
+
req.event in { CREATE: 1, NEW: 1 } ||
|
|
245
|
+
this.operations[req.event] ||
|
|
246
|
+
// collection-bound actions have no instance to filter -> only a static where can apply
|
|
247
|
+
(boundAction && isBoundToCollection(boundAction))
|
|
248
|
+
) {
|
|
242
249
|
const staticAuthRestriction = _getStaticAuthRestrictions(resolvedApplicables)
|
|
243
250
|
if (staticAuthRestriction.length > 0) {
|
|
244
251
|
return _handleStaticAuthRestrictions(staticAuthRestriction, req)
|
|
@@ -2,6 +2,8 @@ const cds = require('../../cds')
|
|
|
2
2
|
const { SELECT } = cds.ql
|
|
3
3
|
|
|
4
4
|
module.exports = exports = cds.service.impl(function () {
|
|
5
|
+
const { parent_skip_auth } = cds.env.features
|
|
6
|
+
|
|
5
7
|
// prettier-ignore
|
|
6
8
|
this.on(['CREATE', 'READ', 'UPDATE', 'UPSERT', 'DELETE'], '*', async function handle_crud_requests(req) {
|
|
7
9
|
if (!cds.db)
|
|
@@ -11,18 +13,26 @@ module.exports = exports = cds.service.impl(function () {
|
|
|
11
13
|
if (req.target['@cds.persistence.skip'] === true && req.target['@cds.persistence.table'] !== true)
|
|
12
14
|
return req.reject(501, `Entity "${req.target.name}" is annotated with "@cds.persistence.skip" and cannot be served generically.`)
|
|
13
15
|
|
|
14
|
-
const { ref } = req.query
|
|
15
|
-
const
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
16
|
+
const { ref } = req.query?.INSERT?.into || req.query?.SELECT?.from || {}
|
|
17
|
+
const parent_exists_query = ref?.length > 1 && !('$parent' in (req.query?.elements ?? {}))
|
|
18
|
+
? SELECT.one`1 as $parent`.from({ ref: ref.slice(0, -1) })
|
|
19
|
+
: null
|
|
20
|
+
const parent_readable_check = parent_exists_query
|
|
21
|
+
? async () => (parent_skip_auth ? cds.db : this).run(parent_exists_query).catch(() => null)
|
|
22
|
+
: null
|
|
23
|
+
|
|
24
|
+
if (req.event === 'CREATE' && parent_readable_check != null) (await parent_readable_check()) || req.reject(404)
|
|
25
|
+
|
|
26
|
+
if (req.target?._isSingleton) await handle_singleton_request(req)
|
|
27
|
+
|
|
28
|
+
if (req.query?.SELECT && req.locale) req.query.SELECT.localized ??= true
|
|
19
29
|
|
|
20
30
|
// REVISIT for cds^10: can we always use cds.db.dispatch(req)?
|
|
21
31
|
const result = req.iterator && !req.objectMode
|
|
22
32
|
? await cds.db.dispatch(req)
|
|
23
33
|
: await cds.run(req.query, req.data)
|
|
24
34
|
|
|
25
|
-
return await exports._handle_result(req, result,
|
|
35
|
+
return await exports._handle_result(req, result, parent_readable_check)
|
|
26
36
|
})
|
|
27
37
|
})
|
|
28
38
|
|
|
@@ -42,14 +52,14 @@ async function handle_singleton_request(req) {
|
|
|
42
52
|
req.query.where(singleton)
|
|
43
53
|
}
|
|
44
54
|
|
|
45
|
-
async function new_behavior(req, result,
|
|
55
|
+
async function new_behavior(req, result, parent_readable_check) {
|
|
46
56
|
const n = result?.affected ?? result?.length ?? result
|
|
47
57
|
|
|
48
58
|
// prettier-ignore
|
|
49
59
|
switch (req.event) {
|
|
50
60
|
case 'READ':
|
|
51
61
|
if (!n && req._etagValidationType === 'if-match') req.reject(412)
|
|
52
|
-
if (!n
|
|
62
|
+
if (!n && parent_readable_check != null) (await parent_readable_check()) || req.reject(404)
|
|
53
63
|
return result
|
|
54
64
|
case 'INSERT': case 'CREATE':
|
|
55
65
|
if (result.affected != null) return result //> db service returned [affected]
|
|
@@ -453,7 +453,7 @@ const compileUpdatedDraftMessages = (newMessages, persistedMessages, requestData
|
|
|
453
453
|
if (!prefixRef) return null
|
|
454
454
|
|
|
455
455
|
const draftMessageTargetPrefix = cds.odata.urlify(
|
|
456
|
-
{ SELECT: { from: { ref: prefixRef } } },
|
|
456
|
+
{ query: { SELECT: { from: { ref: prefixRef } } }, subject: { ref: prefixRef } },
|
|
457
457
|
{ kind: 'odata-v4', model: txModel }
|
|
458
458
|
).path
|
|
459
459
|
|
|
@@ -483,7 +483,7 @@ const compileUpdatedDraftMessages = (newMessages, persistedMessages, requestData
|
|
|
483
483
|
}
|
|
484
484
|
|
|
485
485
|
message.prefix = cds.odata.urlify(
|
|
486
|
-
{ SELECT: { from: { ref: messagePrefixRef } } },
|
|
486
|
+
{ query: { SELECT: { from: { ref: messagePrefixRef } } }, subject: { ref: messagePrefixRef } },
|
|
487
487
|
{ kind: 'odata-v4', model: txModel }
|
|
488
488
|
).path
|
|
489
489
|
|
|
@@ -1437,11 +1437,11 @@ const Read = {
|
|
|
1437
1437
|
|
|
1438
1438
|
// TODO: This seems excessive ... how to compare more efficiently?
|
|
1439
1439
|
const queryPrefixUrl = cds.odata.urlify(
|
|
1440
|
-
{ SELECT: { from: { ref: queryPrefixRef } } },
|
|
1440
|
+
{ query: { SELECT: { from: { ref: queryPrefixRef } } }, subject: { ref: queryPrefixRef } },
|
|
1441
1441
|
{ kind: 'odata-v4', model: txModel }
|
|
1442
1442
|
).path
|
|
1443
1443
|
const msgPrefixUrl = cds.odata.urlify(
|
|
1444
|
-
{ SELECT: { from: { ref: msgPrefixRef } } },
|
|
1444
|
+
{ query: { SELECT: { from: { ref: msgPrefixRef } } }, subject: { ref: msgPrefixRef } },
|
|
1445
1445
|
{ kind: 'odata-v4', model: txModel }
|
|
1446
1446
|
).path
|
|
1447
1447
|
|
|
@@ -2443,7 +2443,7 @@ async function onCancel(req, next) {
|
|
|
2443
2443
|
|
|
2444
2444
|
const prefixRef = _extractPrefixRef(req.query.DELETE.from.ref, queryRootEntity)
|
|
2445
2445
|
const messageTargetPrefix = cds.odata.urlify(
|
|
2446
|
-
{ SELECT: { from: { ref: prefixRef } } },
|
|
2446
|
+
{ query: { SELECT: { from: { ref: prefixRef } } }, subject: { ref: prefixRef } },
|
|
2447
2447
|
{ kind: 'odata-v4', model: req.context.tx.model }
|
|
2448
2448
|
).path
|
|
2449
2449
|
|
|
@@ -2570,6 +2570,7 @@ const _readAfterDraftAction = async function ({ req, payload, action }) {
|
|
|
2570
2570
|
}
|
|
2571
2571
|
}
|
|
2572
2572
|
|
|
2573
|
+
// prettier-ignore
|
|
2573
2574
|
module.exports = cds.service.impl(function () {
|
|
2574
2575
|
if (!this.entities?.DraftAdministrativeData) return
|
|
2575
2576
|
|
|
@@ -2577,14 +2578,17 @@ module.exports = cds.service.impl(function () {
|
|
|
2577
2578
|
Object.defineProperty(this, '_datasource', { value: cds.db })
|
|
2578
2579
|
|
|
2579
2580
|
// Extend the AppService's API by draft specific functions
|
|
2580
|
-
this.new = (draft, key)
|
|
2581
|
-
|
|
2582
|
-
|
|
2583
|
-
|
|
2584
|
-
|
|
2585
|
-
|
|
2586
|
-
|
|
2587
|
-
this.
|
|
2581
|
+
this.new = function (draft, key) {
|
|
2582
|
+
return {
|
|
2583
|
+
then: (r, e) => this.send('NEW', draft, key).then(r, e),
|
|
2584
|
+
for: key => this.send('EDIT', typeof draft === 'string' ? draft.replace(/\.drafts$/, '') : draft.actives, key)
|
|
2585
|
+
}
|
|
2586
|
+
}
|
|
2587
|
+
|
|
2588
|
+
this.edit = function (active, key) { return this.send('EDIT', active, key) }
|
|
2589
|
+
this.save = function (draft, key) { return this.send('SAVE', draft, key) }
|
|
2590
|
+
this.cancel = function (draft, key) { return this.send('CANCEL', draft, key) }
|
|
2591
|
+
this.discard = function (draft, key) { return this.send('DISCARD', draft, key) }
|
|
2588
2592
|
|
|
2589
2593
|
// Override the AppService's handle function
|
|
2590
2594
|
this.handle = !cds.env.features.legacy_srv_results
|
|
@@ -2596,9 +2600,13 @@ module.exports = cds.service.impl(function () {
|
|
|
2596
2600
|
return Array.isArray(res) && 'affected' in res ? req.data : res
|
|
2597
2601
|
}
|
|
2598
2602
|
|
|
2599
|
-
|
|
2600
|
-
|
|
2601
|
-
|
|
2602
|
-
this.on('
|
|
2603
|
+
// NOTE: These handler registrations MUST use inline functions
|
|
2604
|
+
// NOTE: > Arrow functions or functions bound with `.bind` will
|
|
2605
|
+
// NOTE: > ... not be able to access the context tx from `this`
|
|
2606
|
+
this.on('NEW', '*', function (req, next) { return onNew.call(this, req, next) })
|
|
2607
|
+
this.on('EDIT', '*', function (req, next) { return onEdit.call(this, req, next) })
|
|
2608
|
+
this.on('CANCEL', '*', function (req, next) { return onCancel.call(this, req, next) })
|
|
2609
|
+
this.on('draftPrepare', '*', function (req, next) { return onPrepare.call(this, req, next) })
|
|
2603
2610
|
})
|
|
2611
|
+
|
|
2604
2612
|
module.exports.compileUpdatedDraftMessages = compileUpdatedDraftMessages
|