@sap/cds 5.9.7 → 6.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (381) hide show
  1. package/CHANGELOG.md +267 -20
  2. package/apis/services.d.ts +1 -1
  3. package/app/fiori/preview.js +2 -6
  4. package/app/index.js +3 -3
  5. package/bin/build/buildTaskEngine.js +17 -15
  6. package/bin/build/buildTaskFactory.js +29 -19
  7. package/bin/build/buildTaskHandler.js +27 -11
  8. package/bin/build/buildTaskProvider.js +2 -4
  9. package/bin/build/buildTaskProviderFactory.js +11 -16
  10. package/bin/build/constants.js +14 -6
  11. package/bin/build/csv-reader.js +2 -1
  12. package/bin/build/index.js +12 -18
  13. package/bin/build/provider/buildTaskHandlerEdmx.js +3 -39
  14. package/bin/build/provider/buildTaskHandlerFeatureToggles.js +149 -0
  15. package/bin/build/provider/buildTaskHandlerInternal.js +2 -3
  16. package/bin/build/provider/buildTaskProviderInternal.js +108 -239
  17. package/bin/build/provider/fiori/index.js +2 -2
  18. package/bin/build/provider/hana/2migration.js +11 -11
  19. package/bin/build/provider/hana/2tabledata.js +3 -3
  20. package/bin/build/provider/hana/index.js +89 -99
  21. package/bin/build/provider/hana/migrationtable.js +4 -3
  22. package/bin/build/provider/java/index.js +101 -0
  23. package/bin/build/provider/java-cf/index.js +1 -101
  24. package/bin/build/provider/mtx/index.js +90 -53
  25. package/bin/build/provider/mtx/resourcesTarBuilder.js +68 -0
  26. package/bin/build/provider/mtx-sidecar/index.js +110 -0
  27. package/bin/build/provider/node-cf/index.js +1 -308
  28. package/bin/build/provider/nodejs/index.js +189 -0
  29. package/bin/build/util.js +19 -31
  30. package/bin/cds.js +5 -3
  31. package/bin/deploy/to-hana/cfUtil.js +31 -6
  32. package/bin/deploy/to-hana/gitUtil.js +5 -3
  33. package/bin/deploy/to-hana/hana.js +9 -10
  34. package/bin/{build → deploy/to-hana}/mtaUtil.js +10 -9
  35. package/bin/mtx/in-cds.js +19 -7
  36. package/bin/serve.js +56 -21
  37. package/bin/utils/log.js +13 -30
  38. package/bin/version.js +5 -4
  39. package/common.cds +61 -16
  40. package/lib/compile/cdsc.js +3 -2
  41. package/lib/compile/etc/_localized.js +15 -14
  42. package/lib/compile/for/drafts.js +3 -4
  43. package/lib/compile/for/java.js +13 -10
  44. package/lib/compile/for/nodejs.js +8 -8
  45. package/lib/compile/for/odata.js +7 -12
  46. package/lib/compile/for/sql.js +5 -6
  47. package/lib/compile/index.js +5 -4
  48. package/lib/compile/load.js +9 -11
  49. package/lib/compile/minify.js +8 -5
  50. package/lib/compile/parse.js +4 -2
  51. package/lib/compile/resolve.js +18 -15
  52. package/lib/compile/to/edm.js +0 -1
  53. package/lib/compile/to/gql.js +3 -2
  54. package/lib/compile/to/json.js +24 -17
  55. package/lib/connect/bindings.js +3 -2
  56. package/lib/connect/index.js +5 -5
  57. package/lib/core/classes.js +74 -2
  58. package/lib/core/entities.js +52 -3
  59. package/lib/core/reflect.js +2 -1
  60. package/lib/deploy.js +11 -8
  61. package/lib/env/defaults.js +4 -3
  62. package/lib/env/index.js +71 -31
  63. package/lib/env/presets.js +1 -14
  64. package/lib/env/requires.js +71 -20
  65. package/lib/env/serviceBindings.js +147 -0
  66. package/lib/i18n/localize.js +22 -23
  67. package/lib/index.js +148 -144
  68. package/lib/log/errors.js +55 -12
  69. package/lib/log/format/kibana.js +1 -1
  70. package/lib/log/index.js +4 -0
  71. package/lib/ql/SELECT.js +7 -2
  72. package/lib/ql/Whereable.js +8 -2
  73. package/lib/ql/index.js +2 -2
  74. package/lib/req/assert.js +71 -0
  75. package/lib/req/cds-context.js +38 -70
  76. package/lib/req/context.js +34 -21
  77. package/lib/req/request.js +12 -18
  78. package/lib/req/response.js +6 -2
  79. package/lib/req/user.js +30 -22
  80. package/lib/serve/Service-api.js +17 -12
  81. package/lib/serve/Service-dispatch.js +5 -9
  82. package/lib/serve/Service-methods.js +4 -3
  83. package/lib/serve/Transaction.js +24 -21
  84. package/lib/serve/adapters.js +15 -5
  85. package/lib/serve/factory.js +23 -20
  86. package/lib/serve/index.js +51 -54
  87. package/lib/utils/axios.js +8 -12
  88. package/lib/utils/index.js +3 -3
  89. package/lib/utils/resources/index.js +1 -44
  90. package/lib/utils/resources/tar.js +2 -1
  91. package/lib/utils/tests.js +13 -15
  92. package/libx/_runtime/.eslintrc +1 -1
  93. package/libx/_runtime/audit/Service.js +6 -4
  94. package/libx/_runtime/audit/generic/personal/access.js +19 -43
  95. package/libx/_runtime/audit/generic/personal/index.js +40 -34
  96. package/libx/_runtime/audit/generic/personal/modification.js +11 -9
  97. package/libx/_runtime/audit/generic/personal/utils.js +13 -6
  98. package/libx/_runtime/audit/utils/v2.js +6 -3
  99. package/libx/_runtime/auth/index.js +71 -66
  100. package/libx/_runtime/auth/strategies/JWT.js +3 -2
  101. package/libx/_runtime/auth/strategies/mock.js +54 -53
  102. package/libx/_runtime/auth/strategies/xssecUtils.js +3 -4
  103. package/libx/_runtime/auth/strategies/xsuaa.js +3 -2
  104. package/libx/_runtime/auth/utils.js +2 -15
  105. package/libx/_runtime/cds-services/adapter/odata-v4/Dispatcher.js +128 -42
  106. package/libx/_runtime/cds-services/adapter/odata-v4/OData.js +6 -3
  107. package/libx/_runtime/cds-services/adapter/odata-v4/ODataRequest.js +93 -73
  108. package/libx/_runtime/cds-services/adapter/odata-v4/handlers/action.js +10 -45
  109. package/libx/_runtime/cds-services/adapter/odata-v4/handlers/create.js +5 -9
  110. package/libx/_runtime/cds-services/adapter/odata-v4/handlers/error.js +9 -5
  111. package/libx/_runtime/cds-services/adapter/odata-v4/handlers/metadata.js +4 -2
  112. package/libx/_runtime/cds-services/adapter/odata-v4/handlers/read.js +60 -53
  113. package/libx/_runtime/cds-services/adapter/odata-v4/handlers/request.js +1 -1
  114. package/libx/_runtime/cds-services/adapter/odata-v4/handlers/update.js +15 -21
  115. package/libx/_runtime/cds-services/adapter/odata-v4/odata-to-cqn/ExpressionToCQN.js +8 -15
  116. package/libx/_runtime/cds-services/adapter/odata-v4/odata-to-cqn/expandToCQN.js +29 -41
  117. package/libx/_runtime/cds-services/adapter/odata-v4/odata-to-cqn/index.js +1 -4
  118. package/libx/_runtime/cds-services/adapter/odata-v4/odata-to-cqn/readToCQN.js +13 -13
  119. package/libx/_runtime/cds-services/adapter/odata-v4/odata-to-cqn/selectToCQN.js +0 -7
  120. package/libx/_runtime/cds-services/adapter/odata-v4/odata-to-cqn/utils.js +24 -1
  121. package/libx/_runtime/cds-services/adapter/odata-v4/okra/odata-commons/edm/EdmEntityContainer.js +1 -1
  122. package/libx/_runtime/cds-services/adapter/odata-v4/okra/odata-commons/uri/UriHelper.js +4 -3
  123. package/libx/_runtime/cds-services/adapter/odata-v4/okra/odata-commons/utils/PrimitiveValueDecoder.js +4 -5
  124. package/libx/_runtime/cds-services/adapter/odata-v4/okra/odata-commons/utils/ValueConverter.js +4 -3
  125. package/libx/_runtime/cds-services/adapter/odata-v4/okra/odata-commons/validator/ValueValidator.js +5 -3
  126. package/libx/_runtime/cds-services/adapter/odata-v4/okra/odata-server/core/ResponseHeaderSetter.js +2 -0
  127. package/libx/_runtime/cds-services/adapter/odata-v4/okra/odata-server/invocation/DebugSerializingCommand.js +1 -1
  128. package/libx/_runtime/cds-services/adapter/odata-v4/okra/odata-server/invocation/PresetResponseHeadersCommand.js +1 -1
  129. package/libx/_runtime/cds-services/adapter/odata-v4/okra/odata-server/invocation/SerializingCommand.js +1 -1
  130. package/libx/_runtime/cds-services/adapter/odata-v4/okra/odata-server/invocation/SetResponseHeadersCommand.js +1 -1
  131. package/libx/_runtime/cds-services/adapter/odata-v4/okra/odata-server/serializer/ContextURLFactory.js +3 -2
  132. package/libx/_runtime/cds-services/adapter/odata-v4/okra/odata-server/serializer/ErrorJsonSerializer.js +3 -1
  133. package/libx/_runtime/cds-services/adapter/odata-v4/okra/odata-server/serializer/SerializerFactory.js +1 -0
  134. package/libx/_runtime/cds-services/adapter/odata-v4/okra/odata-server/serializer/TrustedResourceJsonSerializer.js +3 -3
  135. package/libx/_runtime/cds-services/adapter/odata-v4/utils/data.js +36 -25
  136. package/libx/_runtime/cds-services/adapter/odata-v4/utils/handlerUtils.js +100 -91
  137. package/libx/_runtime/cds-services/adapter/odata-v4/utils/metaInfo.js +382 -0
  138. package/libx/_runtime/cds-services/adapter/odata-v4/utils/oDataConfiguration.js +1 -4
  139. package/libx/_runtime/cds-services/adapter/odata-v4/utils/omitValues.js +5 -6
  140. package/libx/_runtime/cds-services/adapter/odata-v4/utils/readAfterWrite.js +77 -21
  141. package/libx/_runtime/cds-services/adapter/odata-v4/utils/request.js +3 -11
  142. package/libx/_runtime/cds-services/adapter/odata-v4/utils/result.js +91 -69
  143. package/libx/_runtime/cds-services/adapter/odata-v4/utils/stream.js +27 -6
  144. package/libx/_runtime/cds-services/adapter/rest/utils/validation-checks.js +7 -17
  145. package/libx/_runtime/cds-services/services/Service.js +17 -76
  146. package/libx/_runtime/cds-services/services/utils/columns.js +6 -4
  147. package/libx/_runtime/cds-services/services/utils/compareJson.js +1 -53
  148. package/libx/_runtime/cds-services/services/utils/differ.js +15 -19
  149. package/libx/_runtime/cds-services/util/assert.js +107 -34
  150. package/libx/_runtime/cds.js +1 -31
  151. package/libx/_runtime/common/aspects/Association.js +40 -54
  152. package/libx/_runtime/common/aspects/any.js +61 -6
  153. package/libx/_runtime/common/aspects/entity.js +19 -79
  154. package/libx/_runtime/common/composition/data.js +2 -2
  155. package/libx/_runtime/common/composition/delete.js +8 -7
  156. package/libx/_runtime/common/composition/tree.js +10 -10
  157. package/libx/_runtime/common/composition/update.js +3 -2
  158. package/libx/_runtime/common/constants/events.js +15 -0
  159. package/libx/_runtime/common/error/entry.js +9 -3
  160. package/libx/_runtime/common/error/frontend.js +13 -19
  161. package/libx/_runtime/common/error/index.js +8 -3
  162. package/libx/_runtime/common/generic/auth/capabilities.js +2 -1
  163. package/libx/_runtime/common/generic/auth/constants.js +1 -4
  164. package/libx/_runtime/common/generic/auth/requires.js +1 -1
  165. package/libx/_runtime/common/generic/auth/restrict.js +12 -28
  166. package/libx/_runtime/common/generic/auth/restrictions.js +12 -4
  167. package/libx/_runtime/common/generic/auth/utils.js +2 -1
  168. package/libx/_runtime/common/generic/crud.js +9 -60
  169. package/libx/_runtime/common/generic/etag.js +41 -7
  170. package/libx/_runtime/common/generic/input.js +128 -66
  171. package/libx/_runtime/common/generic/paging.js +9 -3
  172. package/libx/_runtime/common/generic/put.js +2 -2
  173. package/libx/_runtime/common/generic/sorting.js +7 -3
  174. package/libx/_runtime/common/generic/temporal.js +0 -5
  175. package/libx/_runtime/common/i18n/messages.properties +2 -1
  176. package/libx/_runtime/common/utils/binary.js +69 -0
  177. package/libx/_runtime/common/utils/cqn.js +39 -14
  178. package/libx/_runtime/common/utils/cqn2cqn4sql.js +93 -59
  179. package/libx/_runtime/common/utils/csn.js +87 -85
  180. package/libx/_runtime/common/utils/dollar.js +8 -7
  181. package/libx/_runtime/common/utils/draft.js +1 -1
  182. package/libx/_runtime/common/utils/foreignKeyPropagations.js +23 -7
  183. package/libx/_runtime/common/utils/generateOnCond.js +2 -1
  184. package/libx/_runtime/common/utils/keys.js +30 -13
  185. package/libx/_runtime/common/utils/postProcessing.js +6 -1
  186. package/libx/_runtime/common/utils/quotingStyles.js +0 -23
  187. package/libx/_runtime/common/utils/resolveStructured.js +23 -26
  188. package/libx/_runtime/common/utils/resolveView.js +4 -1
  189. package/libx/_runtime/common/utils/rewriteAsterisks.js +3 -0
  190. package/libx/_runtime/common/utils/search2cqn4sql.js +4 -13
  191. package/libx/_runtime/common/utils/searchToLike.js +9 -13
  192. package/libx/_runtime/common/utils/streamProp.js +35 -0
  193. package/libx/_runtime/common/utils/structured.js +12 -18
  194. package/libx/_runtime/common/utils/template.js +3 -5
  195. package/libx/_runtime/common/utils/templateProcessor.js +22 -14
  196. package/libx/_runtime/common/utils/unionCqnTemplate.js +4 -14
  197. package/libx/_runtime/db/Service.js +2 -1
  198. package/libx/_runtime/db/expand/expand-v2.js +2 -2
  199. package/libx/_runtime/db/expand/expandCQNToJoin.js +7 -6
  200. package/libx/_runtime/db/generic/input.js +14 -17
  201. package/libx/_runtime/db/generic/integrity.js +1 -2
  202. package/libx/_runtime/db/generic/update.js +14 -1
  203. package/libx/_runtime/db/query/read.js +0 -1
  204. package/libx/_runtime/db/query/update.js +1 -1
  205. package/libx/_runtime/db/sql-builder/BaseBuilder.js +1 -1
  206. package/libx/_runtime/db/sql-builder/ExpressionBuilder.js +5 -31
  207. package/libx/_runtime/db/sql-builder/InsertBuilder.js +1 -1
  208. package/libx/_runtime/db/sql-builder/ReferenceBuilder.js +0 -9
  209. package/libx/_runtime/db/sql-builder/SelectBuilder.js +11 -10
  210. package/libx/_runtime/db/sql-builder/UpdateBuilder.js +2 -2
  211. package/libx/_runtime/db/sql-builder/annotations.js +1 -2
  212. package/libx/_runtime/db/utils/coloredTxCommands.js +5 -0
  213. package/libx/_runtime/db/utils/columns.js +1 -1
  214. package/libx/_runtime/db/utils/propagateForeignKeys.js +10 -2
  215. package/libx/_runtime/extensibility/activate.js +69 -0
  216. package/libx/_runtime/extensibility/add.js +41 -0
  217. package/libx/_runtime/extensibility/addExtension.js +68 -0
  218. package/libx/_runtime/extensibility/defaults.js +39 -0
  219. package/libx/_runtime/extensibility/{uiflex/handler → handler}/transformREAD.js +0 -0
  220. package/libx/_runtime/extensibility/{uiflex/handler → handler}/transformRESULT.js +2 -2
  221. package/libx/_runtime/extensibility/{uiflex/handler → handler}/transformWRITE.js +2 -2
  222. package/libx/_runtime/extensibility/push.js +61 -0
  223. package/libx/_runtime/extensibility/service.js +21 -0
  224. package/libx/_runtime/extensibility/{uiflex/utils.js → utils.js} +39 -3
  225. package/libx/_runtime/extensibility/validation.js +53 -0
  226. package/libx/_runtime/extensibility/views.js +12 -0
  227. package/libx/_runtime/fiori/generic/activate.js +6 -4
  228. package/libx/_runtime/fiori/generic/before.js +17 -29
  229. package/libx/_runtime/fiori/generic/cancel.js +2 -4
  230. package/libx/_runtime/fiori/generic/delete.js +2 -4
  231. package/libx/_runtime/fiori/generic/edit.js +3 -7
  232. package/libx/_runtime/fiori/generic/index.js +31 -0
  233. package/libx/_runtime/fiori/generic/new.js +2 -4
  234. package/libx/_runtime/fiori/generic/patch.js +4 -8
  235. package/libx/_runtime/fiori/generic/prepare.js +2 -4
  236. package/libx/_runtime/fiori/generic/read.js +137 -162
  237. package/libx/_runtime/fiori/generic/readOverDraft.js +10 -4
  238. package/libx/_runtime/fiori/utils/handler.js +10 -5
  239. package/libx/_runtime/fiori/utils/where.js +1 -4
  240. package/libx/_runtime/hana/Service.js +14 -7
  241. package/libx/_runtime/hana/customBuilder/CustomSelectBuilder.js +1 -1
  242. package/libx/_runtime/hana/dynatrace.js +2 -2
  243. package/libx/_runtime/hana/localized.js +7 -6
  244. package/libx/_runtime/hana/pool.js +9 -6
  245. package/libx/_runtime/hana/search.js +2 -3
  246. package/libx/_runtime/hana/{searchToContains.js → search2Contains.js} +5 -2
  247. package/libx/_runtime/hana/search2cqn4sql.js +20 -17
  248. package/libx/_runtime/index.js +2 -6
  249. package/libx/_runtime/messaging/AMQPWebhookMessaging.js +11 -2
  250. package/libx/_runtime/messaging/common-utils/AMQPClient.js +4 -3
  251. package/libx/_runtime/messaging/common-utils/appId.js +9 -0
  252. package/libx/_runtime/messaging/common-utils/authorizedRequest.js +2 -18
  253. package/libx/_runtime/messaging/common-utils/connections.js +1 -1
  254. package/libx/_runtime/messaging/enterprise-messaging-shared.js +2 -2
  255. package/libx/_runtime/messaging/enterprise-messaging-utils/EMManagement.js +305 -231
  256. package/libx/_runtime/messaging/enterprise-messaging-utils/cloudEvents.js +2 -2
  257. package/libx/_runtime/messaging/enterprise-messaging-utils/options-management.js +15 -8
  258. package/libx/_runtime/messaging/enterprise-messaging-utils/options-messaging.js +57 -14
  259. package/libx/_runtime/messaging/enterprise-messaging.js +14 -19
  260. package/libx/_runtime/messaging/file-based.js +2 -1
  261. package/libx/_runtime/messaging/http-utils/token.js +18 -6
  262. package/libx/_runtime/messaging/message-queuing-utils/options-management.js +22 -12
  263. package/libx/_runtime/messaging/message-queuing-utils/options-messaging.js +27 -14
  264. package/libx/_runtime/messaging/message-queuing.js +138 -85
  265. package/libx/_runtime/messaging/outbox/utils.js +13 -7
  266. package/libx/_runtime/messaging/redis-messaging.js +0 -1
  267. package/libx/_runtime/messaging/service.js +4 -1
  268. package/libx/_runtime/remote/Service.js +24 -18
  269. package/libx/_runtime/remote/utils/client.js +84 -46
  270. package/libx/_runtime/remote/utils/data.js +23 -6
  271. package/libx/_runtime/sqlite/Service.js +14 -13
  272. package/libx/_runtime/sqlite/convertAssocToOneManaged.js +2 -0
  273. package/libx/_runtime/sqlite/customBuilder/CustomSelectBuilder.js +1 -0
  274. package/libx/_runtime/sqlite/execute.js +3 -9
  275. package/libx/_runtime/types/api.js +23 -11
  276. package/libx/common/utils/ucsn.js +15 -9
  277. package/libx/odata/afterburner.js +109 -29
  278. package/libx/odata/cqn2odata.js +48 -9
  279. package/libx/odata/grammar.pegjs +261 -157
  280. package/libx/odata/index.js +21 -9
  281. package/libx/odata/parseToCqn.js +8 -5
  282. package/libx/odata/parser.js +1 -1
  283. package/libx/odata/utils.js +13 -3
  284. package/libx/rest/RestAdapter.js +173 -113
  285. package/libx/rest/RestRequest.js +3 -2
  286. package/libx/rest/middleware/create.js +8 -6
  287. package/libx/rest/middleware/delete.js +6 -13
  288. package/libx/rest/middleware/error.js +1 -1
  289. package/libx/rest/middleware/input.js +6 -6
  290. package/libx/rest/middleware/operation.js +8 -3
  291. package/libx/rest/middleware/parse.js +3 -3
  292. package/libx/rest/middleware/payload.js +12 -0
  293. package/libx/rest/middleware/read.js +12 -2
  294. package/libx/rest/middleware/update.js +3 -3
  295. package/package.json +4 -6
  296. package/server.js +3 -44
  297. package/srv/extensibility-service.cds +56 -0
  298. package/srv/extensibility-service.js +1 -0
  299. package/srv/extensions.cds +8 -0
  300. package/srv/model-provider.cds +59 -0
  301. package/srv/model-provider.js +163 -0
  302. package/srv/mtx.cds +2 -0
  303. package/srv/mtx.js +22 -0
  304. package/srv/outbox.cds +2 -0
  305. package/tasks/enterprise-messaging-deploy.js +19 -12
  306. package/lib/serve/Service-compat.js +0 -36
  307. package/libx/_runtime/audit/generic/personal/constants.js +0 -4
  308. package/libx/_runtime/auth/strategies/dwc.js +0 -45
  309. package/libx/_runtime/cds-services/adapter/odata-v4/utils/dispatcherUtils.js +0 -56
  310. package/libx/_runtime/cds-services/adapter/rest/Rest.js +0 -183
  311. package/libx/_runtime/cds-services/adapter/rest/RestRequest.js +0 -67
  312. package/libx/_runtime/cds-services/adapter/rest/handlers/create.js +0 -82
  313. package/libx/_runtime/cds-services/adapter/rest/handlers/delete.js +0 -39
  314. package/libx/_runtime/cds-services/adapter/rest/handlers/operation.js +0 -63
  315. package/libx/_runtime/cds-services/adapter/rest/handlers/read.js +0 -52
  316. package/libx/_runtime/cds-services/adapter/rest/handlers/update.js +0 -81
  317. package/libx/_runtime/cds-services/adapter/rest/rest-to-cqn/index.js +0 -56
  318. package/libx/_runtime/cds-services/adapter/rest/rest-to-cqn/utils.js +0 -33
  319. package/libx/_runtime/cds-services/adapter/rest/to.js +0 -8
  320. package/libx/_runtime/cds-services/adapter/rest/utils/binary.js +0 -50
  321. package/libx/_runtime/cds-services/adapter/rest/utils/data.js +0 -117
  322. package/libx/_runtime/cds-services/adapter/rest/utils/header-checks.js +0 -14
  323. package/libx/_runtime/cds-services/adapter/rest/utils/key-value-utils.js +0 -30
  324. package/libx/_runtime/cds-services/adapter/rest/utils/parse-url.js +0 -250
  325. package/libx/_runtime/cds-services/adapter/rest/utils/result.js +0 -26
  326. package/libx/_runtime/cds-services/services/utils/handlerUtils.js +0 -200
  327. package/libx/_runtime/common/aspects/utils.js +0 -152
  328. package/libx/_runtime/common/toggles/handler.js +0 -21
  329. package/libx/_runtime/common/utils/extensibilityUtils.js +0 -18
  330. package/libx/_runtime/extensibility/mps/index.js +0 -5
  331. package/libx/_runtime/extensibility/mps/service.js +0 -111
  332. package/libx/_runtime/extensibility/mps/tar.js +0 -42
  333. package/libx/_runtime/extensibility/mps/utils.js +0 -11
  334. package/libx/_runtime/extensibility/uiflex/index.js +0 -54
  335. package/libx/_runtime/extensibility/uiflex/service.js +0 -276
  336. package/libx/_runtime/messaging/common-utils/naming-conventions.js +0 -20
  337. package/libx/_runtime/remote/utils/client-types.d.ts +0 -7
  338. package/libx/gql/GraphQLAdapter.js +0 -33
  339. package/libx/gql/constants/adapter.js +0 -69
  340. package/libx/gql/constants/cds.js +0 -18
  341. package/libx/gql/constants/graphql.js +0 -33
  342. package/libx/gql/readme.md +0 -1
  343. package/libx/gql/resolvers/crud/create.js +0 -20
  344. package/libx/gql/resolvers/crud/delete.js +0 -29
  345. package/libx/gql/resolvers/crud/index.js +0 -6
  346. package/libx/gql/resolvers/crud/read.js +0 -30
  347. package/libx/gql/resolvers/crud/update.js +0 -42
  348. package/libx/gql/resolvers/crud/utils/index.js +0 -36
  349. package/libx/gql/resolvers/field.js +0 -5
  350. package/libx/gql/resolvers/index.js +0 -7
  351. package/libx/gql/resolvers/mutation.js +0 -23
  352. package/libx/gql/resolvers/parse/ast/enrich.js +0 -52
  353. package/libx/gql/resolvers/parse/ast/fragment.js +0 -11
  354. package/libx/gql/resolvers/parse/ast/fromObject.js +0 -39
  355. package/libx/gql/resolvers/parse/ast/index.js +0 -3
  356. package/libx/gql/resolvers/parse/ast/meta.js +0 -4
  357. package/libx/gql/resolvers/parse/ast/variable.js +0 -7
  358. package/libx/gql/resolvers/parse/ast2cqn/columns.js +0 -44
  359. package/libx/gql/resolvers/parse/ast2cqn/entries.js +0 -31
  360. package/libx/gql/resolvers/parse/ast2cqn/index.js +0 -8
  361. package/libx/gql/resolvers/parse/ast2cqn/limit.js +0 -6
  362. package/libx/gql/resolvers/parse/ast2cqn/orderBy.js +0 -24
  363. package/libx/gql/resolvers/parse/ast2cqn/utils/index.js +0 -3
  364. package/libx/gql/resolvers/parse/ast2cqn/where.js +0 -70
  365. package/libx/gql/resolvers/parse/utils/index.js +0 -8
  366. package/libx/gql/resolvers/query.js +0 -13
  367. package/libx/gql/resolvers/root.js +0 -34
  368. package/libx/gql/schema/generate.js +0 -18
  369. package/libx/gql/schema/index.js +0 -5
  370. package/libx/gql/schema/mutation.js +0 -76
  371. package/libx/gql/schema/query.js +0 -108
  372. package/libx/gql/schema/typeDefMap.js +0 -45
  373. package/libx/gql/schema/utils/index.js +0 -54
  374. package/libx/gql/utils/index.js +0 -12
  375. package/libx/rest/middleware/auth.js +0 -20
  376. package/libx/rest/middleware/content.js +0 -19
  377. package/srv/flex.cds +0 -21
  378. package/srv/flex.js +0 -1
  379. package/srv/mps.cds +0 -23
  380. package/srv/mps.js +0 -1
  381. package/srv/outbox.js +0 -0
@@ -1,88 +1,74 @@
1
- // global.cds is used on purpose here!
2
- const cds = global.cds
1
+ const cds = require('../../cds')
3
2
 
4
- // requesting logger without module on purpose!
5
- const LOG = cds.log()
3
+ const { foreignKeyPropagations } = require('../utils/foreignKeyPropagations')
6
4
 
7
- const ODATA_CONTAINED = '@odata.contained'
5
+ const _hasJoinCondition = e => e.isAssociation && e.on && e.on.length > 2
8
6
 
9
- const { isSelfManaged, isBacklink, getAnchor, getBacklink } = require('./utils')
10
- const { foreignKeyPropagations } = require('../utils/foreignKeyPropagations')
7
+ const _isSelfRef = e => e.ref && e.ref[0] === '$self'
11
8
 
12
- const _logDeprecationForODataContained = () => {
13
- if (!cds._deprecationWarningForODataContained) {
14
- LOG._warn &&
15
- LOG.warn(
16
- 'Annotation "@odata.contained" is deprecated and will be removed in an upcoming release. Use compositions instead of associations.'
17
- )
18
- cds._deprecationWarningForODataContained = true
19
- }
9
+ const _getBacklinkName = on => {
10
+ const i = on.findIndex(_isSelfRef)
11
+ if (i === -1) return
12
+ let ref
13
+ if (on[i + 1] && on[i + 1] === '=') ref = on[i + 2].ref
14
+ if (on[i - 1] && on[i - 1] === '=') ref = on[i - 2].ref
15
+ return ref && ref[ref.length - 1]
20
16
  }
21
17
 
22
- module.exports = class {
23
- get _isAssociationStrict() {
24
- return (
25
- this.own('__isAssociationStrict') ||
26
- this.set('__isAssociationStrict', !!(this.isAssociation && !this.isComposition))
27
- )
28
- }
18
+ const isSelfManaged = e => {
19
+ if (!_hasJoinCondition(e)) return
20
+ return !!e.on.find(_isSelfRef)
21
+ }
29
22
 
30
- get _isAssociationEffective() {
31
- this[ODATA_CONTAINED] && _logDeprecationForODataContained()
32
- return (
33
- this.own('__isAssociationEffective') ||
34
- this.set(
35
- '__isAssociationEffective',
36
- this._isAssociationStrict && (!this[ODATA_CONTAINED] || this.name === 'DraftAdministrativeData')
37
- )
38
- )
23
+ const _isUnManagedAssociation = (e, checkComposition) =>
24
+ e.isAssociation && (!checkComposition || e.isComposition) && _hasJoinCondition(e)
25
+
26
+ const getAnchor = (e, checkComposition) => {
27
+ if (!(e._isAssociationStrict && (e.keys || e.on))) return
28
+ for (const anchor of Object.values(e._target.associations || {})) {
29
+ if (!_isUnManagedAssociation(anchor, checkComposition)) continue
30
+ if (_getBacklinkName(anchor.on) === e.name && anchor.target === e.parent.name) return anchor
39
31
  }
32
+ }
40
33
 
41
- get _isCompositionEffective() {
42
- this[ODATA_CONTAINED] && _logDeprecationForODataContained()
43
- return (
44
- this.own('__isCompositionEffective') ||
45
- this.set(
46
- '__isCompositionEffective',
47
- this.isComposition ||
48
- (this._isAssociationStrict && this[ODATA_CONTAINED] && this.name !== 'DraftAdministrativeData')
49
- )
50
- )
34
+ const getBacklink = (e, checkComposition) => {
35
+ if (!_isUnManagedAssociation(e, checkComposition)) return
36
+ const backlinkName = _getBacklinkName(e.on)
37
+ if (backlinkName) return e._target && e._target.elements && e._target.elements[backlinkName]
38
+ }
39
+
40
+ module.exports = class {
41
+ get _isAssociationStrict() {
42
+ return this.own('__isAssociationStrict', () => !this.isComposition)
51
43
  }
52
44
 
53
45
  get _isContained() {
54
- this[ODATA_CONTAINED] && _logDeprecationForODataContained()
55
46
  return (
56
- this.own('__isContained') ||
57
- this.set(
58
- '__isContained',
59
- this.name !== 'DraftAdministrativeData_DraftUUID' &&
60
- ((this.isAssociation && this[ODATA_CONTAINED]) || (this.isComposition && cds.env.effective.odata.containment))
61
- )
47
+ this.own('__isContained') || this.set('__isContained', this.isComposition && cds.env.effective.odata.containment)
62
48
  )
63
49
  }
64
50
 
65
51
  get _isSelfManaged() {
66
- return this.own('__isSelfManaged') || this.set('__isSelfManaged', isSelfManaged(this))
52
+ return this.own('__isSelfManaged', () => isSelfManaged(this))
67
53
  }
68
54
 
69
55
  get _isBacklink() {
70
- return this.own('__isBacklink') || this.set('__isBacklink', isBacklink(this))
56
+ return this.own('__isBacklink', () => !!getAnchor(this))
71
57
  }
72
58
 
73
59
  get _isCompositionBacklink() {
74
- return this.own('__isCompositionBacklink') || this.set('__isCompositionBacklink', isBacklink(this, true))
60
+ return this.own('__isCompositionBacklink', () => !!getAnchor(this, true))
75
61
  }
76
62
 
77
63
  get _anchor() {
78
- return this.own('__anchor') || this.set('__anchor', getAnchor(this))
64
+ return this.own('__anchor', () => getAnchor(this))
79
65
  }
80
66
 
81
67
  get _backlink() {
82
- return this.own('__backlink') || this.set('__backlink', getBacklink(this))
68
+ return this.own('__backlink', () => getBacklink(this))
83
69
  }
84
70
 
85
71
  get _foreignKeys() {
86
- return this.own('__foreignKeys') || this.set('__foreignKeys', foreignKeyPropagations(this))
72
+ return this.own('__foreignKeys', () => foreignKeyPropagations(this))
87
73
  }
88
74
  }
@@ -1,27 +1,82 @@
1
- const { getRelations, isMandatory, isReadOnly } = require('./utils')
2
1
  const { foreignKey4 } = require('../../common/utils/foreignKeyPropagations')
3
2
 
4
3
  // NOTE: Please only add things which are relevant to _any_ type,
5
4
  // use specialized types otherwise (entity, Association, ...).
6
5
  module.exports = class {
7
6
  get _isStructured() {
8
- return this.own('__isStructured') || this.set('__isStructured', !!this.elements && this.kind !== 'entity')
7
+ return this.own('__isStructured', () => !!this.elements && this.kind !== 'entity')
9
8
  }
10
9
 
11
10
  get _isMandatory() {
12
- return this.own('__isMandatory') || this.set('__isMandatory', !this.isAssociation && isMandatory(this))
11
+ return this.own('__isMandatory', () => !this.isAssociation && isMandatory(this))
13
12
  }
14
13
 
15
14
  get _isReadOnly() {
16
- return this.own('__isReadOnly') || this.set('__isReadOnly', !this.key && isReadOnly(this))
15
+ return this.own('__isReadOnly', () => !this.key && isReadOnly(this))
17
16
  }
18
17
 
19
18
  // REVISIT: Where to put?
20
19
  get _relations() {
21
- return this.own('__relations') || this.set('__relations', getRelations(this))
20
+ return this.own('__relations', () => getRelations(this))
22
21
  }
23
22
 
24
23
  get _foreignKey4() {
25
- return this.own('__foreignKey4') || this.set('__foreignKey4', foreignKey4(this))
24
+ return this.own('__foreignKey4', () => foreignKey4(this))
26
25
  }
27
26
  }
27
+
28
+ const Relation = require('./relation')
29
+ const _exposeRelation = relation => Object.defineProperty({}, '_', { get: () => relation })
30
+
31
+ const _relationHandler = relation => ({
32
+ get: (target, name) => {
33
+ const path = name.split(',')
34
+ const prop = path.join('_')
35
+ if (!target[prop]) {
36
+ if (path.length === 1) {
37
+ // REVISIT: property 'join' must not be used in CSN to make this working
38
+ if (relation._has(prop)) return relation[prop]
39
+ const newRelation = Relation.to(relation, prop)
40
+ if (newRelation) {
41
+ target[prop] = new Proxy(_exposeRelation(newRelation), _relationHandler(newRelation))
42
+ }
43
+ return target[prop]
44
+ }
45
+ target[prop] = path.reduce((r, p) => r[p] || r.csn._relations[p], relation)
46
+ target[prop].path = path
47
+ }
48
+ return target[prop]
49
+ }
50
+ })
51
+
52
+ const getRelations = e => {
53
+ const newRelation = Relation.to(e)
54
+ return new Proxy(_exposeRelation(newRelation), _relationHandler(newRelation))
55
+ }
56
+
57
+ const CommonFieldControl = e => {
58
+ const cfr = e['@Common.FieldControl']
59
+ return cfr && cfr['#']
60
+ }
61
+
62
+ const isMandatory = e => {
63
+ return (
64
+ e['@assert.mandatory'] !== false &&
65
+ (e['@mandatory'] ||
66
+ e['@Common.FieldControl.Mandatory'] ||
67
+ e['@FieldControl.Mandatory'] ||
68
+ CommonFieldControl(e) === 'Mandatory')
69
+ )
70
+ }
71
+
72
+ const isReadOnly = e => {
73
+ return (
74
+ e['@readonly'] ||
75
+ e['@cds.on.update'] ||
76
+ e['@cds.on.insert'] ||
77
+ e['@Core.Computed'] ||
78
+ e['@Common.FieldControl.ReadOnly'] ||
79
+ e['@FieldControl.ReadOnly'] ||
80
+ CommonFieldControl(e) === 'ReadOnly'
81
+ )
82
+ }
@@ -1,12 +1,3 @@
1
- /*
2
- // global.cds is used on purpose here!
3
- const cds = global.cds
4
- */
5
-
6
- const { getETag, hasPersonalData, hasSensitiveData } = require('./utils')
7
-
8
- let getSearchableColumns
9
-
10
1
  const _flat2struct = (def, prefix = '') => {
11
2
  const map = {}
12
3
  for (const ele in def.elements) {
@@ -19,90 +10,39 @@ const _flat2struct = (def, prefix = '') => {
19
10
 
20
11
  module.exports = class {
21
12
  get _isSingleton() {
22
- return (
23
- this.own('__isSingleton') ||
24
- this.set(
25
- '__isSingleton',
26
- !!(this['@odata.singleton'] || (this['@odata.singleton.nullable'] && this['@odata.singleton'] !== false))
27
- )
13
+ return this.own(
14
+ '__isSingleton',
15
+ () => this['@odata.singleton'] || (this['@odata.singleton.nullable'] && this['@odata.singleton'] !== false)
28
16
  )
29
17
  }
30
18
 
31
19
  get _hasPersistenceSkip() {
32
- return (
33
- this.own('__hasPersistenceSkip') ||
34
- this.set(
35
- '__hasPersistenceSkip',
36
- !!(this.own('@cds.persistence.skip') && this.own('@cds.persistence.skip') !== 'if-unused')
37
- )
20
+ return this.own(
21
+ '__hasPersistenceSkip',
22
+ () => this.own('@cds.persistence.skip') && this.own('@cds.persistence.skip') !== 'if-unused'
38
23
  )
39
24
  }
40
25
 
41
26
  get _isDraftEnabled() {
42
- return (
43
- this.own('__isDraftEnabled') ||
44
- this.set(
45
- '__isDraftEnabled',
46
- !!(
47
- (this.associations && this.associations.DraftAdministrativeData) ||
48
- this.name.match(/\.DraftAdministrativeData$/) ||
49
- (this.own('@odata.draft.enabled') && this.own('@Common.DraftRoot.ActivationAction'))
50
- )
27
+ return this.own('__isDraftEnabled', () => {
28
+ return (
29
+ (this.associations && this.associations.DraftAdministrativeData) ||
30
+ this.name.match(/\.DraftAdministrativeData$/) ||
31
+ (this.own('@odata.draft.enabled') && this.own('@Common.DraftRoot.ActivationAction'))
51
32
  )
52
- )
53
- }
54
-
55
- get _searchableColumns() {
56
- // lazily require on first use
57
- getSearchableColumns =
58
- getSearchableColumns || require('../../cds-services/services/utils/columns').getSearchableColumns
59
- return this.own('__searchableColumns') || this.set('__searchableColumns', getSearchableColumns(this))
33
+ })
60
34
  }
61
35
 
62
36
  get _etag() {
63
- return this.own('__etag') || this.set('__etag', getETag(this))
64
- }
65
-
66
- /*
67
- * audit logging
68
- */
69
-
70
- get _hasPersonalData() {
71
- return this.own('__hasPersonalData') || this.set('__hasPersonalData', hasPersonalData(this))
72
- }
73
-
74
- get _hasSensitiveData() {
75
- return this.own('__hasSensitiveData') || this.set('__hasSensitiveData', hasSensitiveData(this))
76
- }
77
-
78
- get _auditCreate() {
79
- return (
80
- this.own('__auditCreate') ||
81
- this.set('__auditCreate', !!(this._hasPersonalData && this['@AuditLog.Operation.Insert']))
82
- )
83
- }
84
-
85
- get _auditRead() {
86
- return (
87
- this.own('__auditRead') || this.set('__auditRead', !!(this._hasPersonalData && this['@AuditLog.Operation.Read']))
88
- )
89
- }
90
-
91
- get _auditUpdate() {
92
- return (
93
- this.own('__auditUpdate') ||
94
- this.set('__auditUpdate', !!(this._hasPersonalData && this['@AuditLog.Operation.Update']))
95
- )
96
- }
97
-
98
- get _auditDelete() {
99
- return (
100
- this.own('__auditDelete') ||
101
- this.set('__auditDelete', !!(this._hasPersonalData && this['@AuditLog.Operation.Delete']))
102
- )
37
+ return this.own('__etag', () => {
38
+ for (const el in this.elements) {
39
+ const element = this.elements[el]
40
+ if (element['@odata.etag']) return element
41
+ }
42
+ })
103
43
  }
104
44
 
105
45
  get _flat2struct() {
106
- return this.own('_flat2struct') || this.set('_flat2struct', _flat2struct(this))
46
+ return this.own('_flat2struct', () => _flat2struct(this))
107
47
  }
108
48
  }
@@ -66,7 +66,7 @@ const _whereKeys = keys => {
66
66
  const where = []
67
67
  keys.forEach(key => {
68
68
  if (where.length) where.push('or')
69
- where.push('(', ...ctUtils.whereKey(key), ')')
69
+ where.push({ xpr: [...ctUtils.whereKey(key)] })
70
70
  })
71
71
  return where
72
72
  }
@@ -137,7 +137,7 @@ const _subWhere = (result, element) => {
137
137
  const whereCQN = ctUtils.whereKey(whereObj)
138
138
  if (whereCQN.length) {
139
139
  if (where.length > 0) where.push('or')
140
- where.push('(', ...whereCQN, ')')
140
+ where.push({ xpr: [...whereCQN] })
141
141
  }
142
142
  }
143
143
  }
@@ -84,16 +84,16 @@ function _getSubWhereAndEntities(element, parentWhere, draft, level = 0, composi
84
84
  }
85
85
 
86
86
  if (whereKeys.length > 0) {
87
- where.push('(', ...whereKeys, ')', 'and')
87
+ where.push({ xpr: [...whereKeys] }, 'and')
88
88
  }
89
89
  if (staticWhereValues.length > 0) {
90
- where.push('(', ...staticWhereValues, ')', 'and')
90
+ where.push({ xpr: [...staticWhereValues] }, 'and')
91
91
  }
92
92
  where.push('exists', {
93
93
  SELECT: {
94
94
  columns: [{ val: 1, as: '_exists' }],
95
95
  from: { ref: [entity2.entityName], as: entity2.alias },
96
- where: parentWhere && parentWhere.length ? ['(', ...parentWhere, ')', 'and', '(', ...subWhere, ')'] : subWhere
96
+ where: parentWhere && parentWhere.length ? [{ xpr: [...parentWhere] }, 'and', { xpr: [...subWhere] }] : subWhere
97
97
  }
98
98
  })
99
99
 
@@ -137,7 +137,7 @@ function _getStaticWhere(allBackLinks, entity1) {
137
137
 
138
138
  const _addToCQNs = (cqns, subCQN, element, model, level) => {
139
139
  // REVISIT:
140
- // The compiler generates foreign-key constraints (except if !cds.env.features._db_foreign_key_constraints)
140
+ // The compiler generates foreign-key constraints (if features.assert_integrity_type = 'DB')
141
141
  // and enables DELETE CASCADE. For these cases, the runtime doesn't need to delete compositions
142
142
  // manually, it's done by the database itself.
143
143
  // However, there are cases (unmanaged compositions), where this doesn't happen.
@@ -197,7 +197,7 @@ const hasDeepDelete = (model, cqn) => {
197
197
 
198
198
  const entity = model.definitions[ensureNoDraftsSuffix(from)]
199
199
 
200
- if (entity) return !!Object.keys(entity.elements || {}).find(k => entity.elements[k]._isCompositionEffective)
200
+ if (entity) return !!Object.keys(entity.elements || {}).find(k => entity.elements[k].isComposition)
201
201
 
202
202
  return false
203
203
  }
@@ -229,14 +229,15 @@ const _getDataFromOncond = (onCond, parent) => {
229
229
  const getSetNullParentForeignKeyCQNs = async (model, req, dbQuery) => {
230
230
  const cqns = []
231
231
  const query = dbQuery || req.query
232
- const origQuery = (req._tx instanceof cds.DatabaseService && req._ && req._.query) || req.query
232
+ // REVISIT: req._tx should not be used like that!
233
+ const origQuery = (req.tx instanceof cds.DatabaseService && req._ && req._.query) || req.query
233
234
  if (!dbQuery && origQuery && origQuery.DELETE && origQuery.DELETE.from.ref && origQuery.DELETE.from.ref.length > 1) {
234
235
  // delete via 2one navigation => parent is known => no need to SELECT
235
236
  const ref = origQuery.DELETE.from.ref
236
237
  const cqn = cqn2cqn4sql(UPDATE.entity({ ref: ref.slice(0, ref.length - 1) }), model)
237
238
  const { target: parent, elementName } = resolveNavigationTarget(cqn, ref, model)
238
239
  const element = parent.elements[elementName]
239
- if (element && element._isCompositionEffective && element.is2one) {
240
+ if (element && element.isComposition && element.is2one) {
240
241
  const onCond = element && parent._relations[element.name].join('$$whatever', '$$parent')
241
242
  const data = _getDataFromOncond(onCond, parent)
242
243
  cqn.data(data)
@@ -32,7 +32,7 @@ const _foreignKeysToLinks = (element, inverse) =>
32
32
  const _resolvedElement = (element, service) => {
33
33
  if (!element.target) return element
34
34
  // skip forbidden view check if association to view with foreign key in target
35
- const skipForbiddenViewCheck = element._isAssociationStrict && !element['@odata.contained']
35
+ const skipForbiddenViewCheck = element._isAssociationStrict
36
36
  const { target, mapping } = getTransition(element._target, service, skipForbiddenViewCheck)
37
37
  const newElement = { target: target.name, _target: target }
38
38
  Object.setPrototypeOf(newElement, element)
@@ -49,12 +49,12 @@ const _resolvedElement = (element, service) => {
49
49
  }
50
50
 
51
51
  const _navigationExistsInCompositionMap = (element, compositionMap) =>
52
- compositionMap.has(element.target) && element._isCompositionEffective
52
+ compositionMap.has(element.target) && element.isComposition
53
53
 
54
54
  const _isUnManaged = element => element.on && !element._isSelfManaged
55
55
 
56
56
  const _isNonRecursiveNavigation = (element, rootEntityName) =>
57
- rootEntityName !== element.target && element._isCompositionEffective
57
+ rootEntityName !== element.target && element.isComposition
58
58
 
59
59
  const _skipPersistence = (element, definitions) => definitions[element.target]._hasPersistenceSkip
60
60
 
@@ -111,7 +111,7 @@ const _getCompositionTreeRec = ({
111
111
  const targetEntity = definitions[element.target]
112
112
  for (const backLinkName in targetEntity.elements) {
113
113
  const _backLink = targetEntity.elements[backLinkName]
114
- if (!_backLink._isAssociationEffective) continue
114
+ if (!_backLink._isAssociationStrict) continue
115
115
  if (
116
116
  _backLink._isCompositionBacklink &&
117
117
  _backLink.target === compositionElement.target &&
@@ -148,7 +148,7 @@ const _getCompositionTreeRec = ({
148
148
  service
149
149
  })
150
150
  } else if (
151
- element._isAssociationEffective &&
151
+ element._isAssociationStrict &&
152
152
  element._isCompositionBacklink &&
153
153
  element.target === compositionTree.target &&
154
154
  compositionMap.has(element.target)
@@ -190,7 +190,7 @@ const _getCompositionTree = ({ definitions, rootEntityName, checkRoot = true, re
190
190
  const rootName = resolveViews ? _resolvedEntityName(rootEntityName, definitions) : rootEntityName
191
191
 
192
192
  if (checkRoot && !isRootEntity(definitions, rootEntityName)) {
193
- throw getError(`Entity "${rootEntityName}" is not root entity`)
193
+ throw getError(400, `Entity "${rootEntityName}" is not root entity`)
194
194
  }
195
195
  const compositionTree = {}
196
196
  _getCompositionTreeRec({
@@ -217,7 +217,7 @@ const _cacheCompositionParentsOfOne = ({ definitions }) => {
217
217
  if (!parent.kind === 'entity' || !parent.elements) continue
218
218
  for (const elementName in parent.elements) {
219
219
  const element = parent.elements[elementName]
220
- if (element._isCompositionEffective && element.is2one && !element._isSelfManaged) {
220
+ if (element.isComposition && element.is2one && !element._isSelfManaged) {
221
221
  const targetName = element.target
222
222
  const target = definitions[targetName]
223
223
  if (!target) continue
@@ -243,7 +243,7 @@ const _memoizeGetCompositionTree = fn => {
243
243
 
244
244
  // use ApplicationService as cache key for extensibility
245
245
  // REVISIT: context._tx is not a stable API -> pls do not rely on that
246
- const cacheKey = (cds.context && cds.context._tx && Object.getPrototypeOf(cds.context._tx)) || definitions
246
+ const cacheKey = (cds.context && cds.context.tx && Object.getPrototypeOf(cds.context.tx)) || definitions
247
247
 
248
248
  const map = cache.get(cacheKey)
249
249
  const cachedResult = map && map.get(key)
@@ -266,14 +266,14 @@ const _memoizeGetCompositionTree = fn => {
266
266
  const getCompositionRoot = (definitions, entity) => {
267
267
  const associationElements = Object.keys(entity.elements)
268
268
  .map(key => entity.elements[key])
269
- .filter(element => element._isAssociationEffective)
269
+ .filter(element => element._isAssociationStrict)
270
270
 
271
271
  for (const { target } of associationElements) {
272
272
  const parentEntity = definitions[target]
273
273
  for (const parentElementName in parentEntity.elements) {
274
274
  const parentElement = parentEntity.elements[parentElementName]
275
275
  if (
276
- parentElement._isCompositionEffective &&
276
+ parentElement.isComposition &&
277
277
  parentElement.target === entity.name &&
278
278
  parentElement.target !== ensureNoDraftsSuffix(parentElement.parent.name)
279
279
  ) {
@@ -43,7 +43,7 @@ function _addSubDeepUpdateCQNForDelete({ entity, data, selectData, deleteCQN })
43
43
  if (deleteCQN.DELETE.where.length > 0) {
44
44
  deleteCQN.DELETE.where.push('or')
45
45
  }
46
- deleteCQN.DELETE.where.push('(', ...ctUtils.whereKey(ctUtils.key(entity, selectEntry)), ')')
46
+ deleteCQN.DELETE.where.push({ xpr: [...ctUtils.whereKey(ctUtils.key(entity, selectEntry))] })
47
47
  }
48
48
  }
49
49
  }
@@ -254,7 +254,8 @@ const _addSubDeepUpdateCQN = async ({ model, compositionTree, data, selectData,
254
254
  const hasDeepUpdate = (model, cqn) => {
255
255
  if (cqn && cqn.UPDATE && cqn.UPDATE.entity && (cqn.UPDATE.data || cqn.UPDATE.with)) {
256
256
  const updateEntity = cqn.UPDATE.entity
257
- const entityName = (updateEntity.ref && updateEntity.ref[0]) || updateEntity.name || updateEntity
257
+ const entityName =
258
+ (updateEntity.ref && (updateEntity.ref[0].id || updateEntity.ref[0])) || updateEntity.name || updateEntity
258
259
  const entity = model.definitions[ensureNoDraftsSuffix(entityName)]
259
260
 
260
261
  if (entity) {
@@ -0,0 +1,15 @@
1
+ const MOD_EVENTS = { UPDATE: 1, DELETE: 1, EDIT: 1 }
2
+ const WRITE_EVENTS = Object.assign({ CREATE: 1, NEW: 1, PATCH: 1, CANCEL: 1 }, MOD_EVENTS)
3
+ const CRUD_EVENTS = Object.assign({ READ: 1 }, WRITE_EVENTS)
4
+ const DRAFT_EVENTS = { PATCH: 1, CANCEL: 1, draftActivate: 1, draftPrepare: 1 }
5
+ const DRAFT_MOD_EVENTS = { draftActivate: 1, EDIT: 1 }
6
+ const CDS_EVENTS = Object.assign({}, CRUD_EVENTS, DRAFT_EVENTS)
7
+
8
+ module.exports = {
9
+ MOD_EVENTS,
10
+ WRITE_EVENTS,
11
+ CRUD_EVENTS,
12
+ DRAFT_EVENTS,
13
+ CDS_EVENTS,
14
+ DRAFT_MOD_EVENTS
15
+ }
@@ -1,11 +1,11 @@
1
1
  /**
2
- * @param {number} [code] - The numeric code. Only if typeof msg === 'string'.
2
+ * @param {number|object} [code] - The numeric code. Only if typeof msg === 'string'.
3
3
  * @param {string|object} msg - The message or text key (string), or entry object (if more details are needed)
4
4
  * @param {number|string} [msg.code] - The numeric or text code.
5
5
  * @param {string} [msg.message] - The message or text key.
6
6
  * @param {string} [msg.target] - The target of the message.
7
7
  * @param {Array|object} [msg.args] - The placeholder values for messages with placeholders.
8
- * @param {any} [msg.<key>] - Additonal properties, e.g., for processing in custom logging (will not reach client).
8
+ * @param {any} [msg.<key>] - Additional properties, e.g., for processing in custom logging (will not reach client).
9
9
  * @param {string} [target] - The target of the message. Only if typeof msg === 'string'.
10
10
  * @param {Array|object} [args] - The placeholder values for messages with placeholders. Only if typeof msg === 'string'.
11
11
  * @returns {object} - The normalized entry
@@ -21,10 +21,16 @@ module.exports = (code, msg, target, args) => {
21
21
  // > params: msg, target?, args?
22
22
  ;[code, msg, target, args] = [undefined, code, msg, target]
23
23
  }
24
+
24
25
  if (target && typeof target === 'object') {
25
26
  // > params: code?, msg, args?
26
27
  ;[args, target] = [target]
27
28
  }
28
29
 
29
- return { code, message: msg || (code && String(code)), target, args }
30
+ return {
31
+ code,
32
+ message: msg || (code && String(code)),
33
+ target,
34
+ args
35
+ }
30
36
  }
@@ -5,10 +5,8 @@
5
5
  * [...]
6
6
  * Error responses MAY contain annotations in any of its JSON objects.
7
7
  */
8
-
9
8
  const localeFrom = require('../../../../lib/req/locale')
10
9
  const { getErrorMessage } = require('./utils')
11
-
12
10
  let _i18n
13
11
  const i18n = (...args) => {
14
12
  if (!_i18n) _i18n = require('../i18n')
@@ -24,16 +22,12 @@ const {
24
22
  } = require('./constants')
25
23
  const ADDITIONAL_MSG_PROPERTIES = Object.keys(ADDITIONAL_MSG_PROPERTIES_MAP)
26
24
 
27
- const SKIP_SANITIZATION = '@cds.skip_sanitization'
28
-
29
25
  const _getFiltered = err => {
30
26
  const error = {}
31
27
 
32
28
  Object.keys(err)
33
29
  .concat(['message'])
34
30
  .forEach(k => {
35
- // REVISIT: do not remove innererror with cds^6
36
- if (k === 'innererror' && process.env.NODE_ENV === 'production' && !err[SKIP_SANITIZATION]) return
37
31
  if (k in ALLOWED_PROPERTIES_MAP || k.startsWith('@')) {
38
32
  error[k] = err[k]
39
33
  } else if (k === 'numericSeverity') {
@@ -44,10 +38,10 @@ const _getFiltered = err => {
44
38
  return error
45
39
  }
46
40
 
47
- const _rewrite = error => {
41
+ const _rewriteDBError = error => {
48
42
  // REVISIT: db stuff probably shouldn't be here
49
43
  if (error.code === 'SQLITE_ERROR') {
50
- error.code = '500'
44
+ error.code = 'null'
51
45
  } else if (
52
46
  (error.code.startsWith('SQLITE_CONSTRAINT') && error.message.match(/COMMIT/)) ||
53
47
  (error.code.startsWith('SQLITE_CONSTRAINT') && error.message.match(/FOREIGN KEY/)) ||
@@ -72,7 +66,7 @@ const _normalize = (err, locale, inner = false) => {
72
66
  error.code = String(error.code || 'null')
73
67
 
74
68
  // REVISIT: code and message rewriting
75
- _rewrite(error)
69
+ _rewriteDBError(error)
76
70
 
77
71
  let statusCode = err.status || err.statusCode || (_isAllowedError(error.code) && error.code)
78
72
 
@@ -87,8 +81,8 @@ const _normalize = (err, locale, inner = false) => {
87
81
  statusCode = statusCode || _statusCodeFromDetails(childErrorCodes)
88
82
  }
89
83
 
90
- // make sure it's a number, if it's an inner error don't set to 500, as will be set on root level if no other inner error has a statusCode
91
- statusCode = statusCode ? Number(statusCode) : inner ? undefined : 500
84
+ // make sure it's a number if set, otherwise will be assigned as 500 in normalizeError
85
+ statusCode = statusCode ? Number(statusCode) : undefined
92
86
 
93
87
  return { error, statusCode }
94
88
  }
@@ -100,25 +94,25 @@ const _isAllowedError = errorCode => {
100
94
  // - for one unique value, we use it
101
95
  // - if at least one 5xx exists, we use 500
102
96
  // - else if at least one 4xx exists, we use 400
103
- // - else we use 500
104
97
  const _statusCodeFromDetails = uniqueStatusCodes => {
105
98
  if (uniqueStatusCodes.size === 1) return uniqueStatusCodes.values().next().value
106
99
  if ([...uniqueStatusCodes].some(s => s >= 500)) return 500
107
100
  if ([...uniqueStatusCodes].some(s => s >= 400)) return 400
108
- return 500
109
101
  }
110
102
 
111
103
  const normalizeError = (err, req) => {
112
104
  const locale = req.locale || (req.locale = localeFrom(req))
113
- const { error, statusCode } = _normalize(err, locale)
105
+ let { error, statusCode } = _normalize(err, locale)
114
106
 
115
- // REVISIT: make === 500 in cds^6
116
- // error[SKIP_SANITIZATION] is not an official API!!!
117
- if (statusCode >= 500 && process.env.NODE_ENV === 'production' && !error[SKIP_SANITIZATION]) {
107
+ if ((!statusCode || (statusCode >= 500 && err._thrownByFramework)) && process.env.NODE_ENV === 'production') {
118
108
  // > return sanitized error to client
119
- return { error: { code: `${statusCode}`, message: i18n(statusCode, locale) }, statusCode }
109
+ return {
110
+ error: { code: statusCode ? `${statusCode}` : '500', message: i18n(statusCode || 500, locale) },
111
+ statusCode: Number(statusCode) || 500
112
+ }
120
113
  }
121
- delete error[SKIP_SANITIZATION]
114
+
115
+ if (!statusCode) statusCode = 500
122
116
 
123
117
  // no top level null codes
124
118
  if (error.code === 'null') {