@sap/cds 5.9.8 → 6.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (381) hide show
  1. package/CHANGELOG.md +252 -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 +83 -41
  25. package/bin/build/provider/mtx/resourcesTarBuilder.js +68 -0
  26. package/bin/build/provider/mtx-sidecar/index.js +80 -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 +4 -3
  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 +70 -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 +127 -41
  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
@@ -2,8 +2,6 @@ const cds = require('../_runtime/cds')
2
2
 
3
3
  const express = require('express')
4
4
 
5
- const auth = require('./middleware/auth')
6
- const content = require('./middleware/content')
7
5
  const parse = require('./middleware/parse')
8
6
  const input = require('./middleware/input')
9
7
 
@@ -12,122 +10,184 @@ const read = require('./middleware/read')
12
10
  const update = require('./middleware/update')
13
11
  const deleet = require('./middleware/delete')
14
12
  const operation = require('./middleware/operation')
13
+ const payload = require('./middleware/payload')
15
14
 
16
15
  const error = require('./middleware/error')
17
16
  const { alias2ref } = require('../_runtime/common/utils/csn')
17
+ const { bufferToBase64 } = require('../_runtime/common/utils/binary')
18
18
 
19
- class RestAdapter extends express.Router {
20
- constructor(srv) {
21
- super()
22
-
23
- alias2ref(srv)
24
-
25
- // pass srv-reated stuff to middlewares via req
26
- this.use('/', (req, res, next) => {
27
- req._srv = srv
28
- next()
29
- })
30
-
31
- this.use(express.json())
32
-
33
- // check @requires as soon as possible (DoS)
34
- this.use('/', auth)
35
-
36
- // service root
37
- const GH = { GET: 1, HEAD: 1 }
38
- this.use('/', (req, res, next) => {
39
- if (req.path !== '/' || !GH[req.method]) return next()
40
- if (req.method === 'HEAD') return res.json({})
41
- res.json(
42
- Object.keys(req._srv.entities).reduce(
43
- (acc, cur) => {
44
- acc.entities.push({ name: cur, url: cur })
45
- return acc
46
- },
47
- { entities: [] }
48
- )
49
- )
50
- })
51
-
52
- // content-type check
53
- this.use('/', content)
54
-
55
- // parse
56
- this.use('/', parse)
57
-
58
- // payload validation
59
- this.use('/', input)
60
-
61
- // begin tx
62
- this.use('/', (req, res, next) => {
63
- // create tx and set as cds.context
64
- // REVISIT: _model should not be necessary
65
- req._tx = cds.context = srv.tx({ user: req.user, req, res, _model: req._srv.model })
66
- next()
67
- })
68
-
69
- // POST
70
- this.post('/*', (req, res, next) => {
71
- if (req._operation) operation(req, res, next)
72
- else create(req, res, next)
73
- })
74
-
75
- // HEAD
76
- this.head('/*', (req, res, next) => {
77
- read(req, res, next)
78
- })
79
-
80
- // GET
81
- this.get('/*', (req, res, next) => {
82
- if (req._operation) operation(req, res, next)
83
- else read(req, res, next)
84
- })
85
-
86
- // PUT, PATCH, DELETE
87
- this.put('/*', update)
88
- this.patch('/*', update)
89
- this.delete('/*', deleet)
90
-
91
- // end tx (i.e., commit or rollback)
92
- this.use('/', async (req, res, next) => {
93
- const { result, status, location } = req._result
94
-
95
- // unfortunately, express doesn't catch async errors -> try catch needed
96
- try {
97
- await req._tx.commit(result)
98
- } catch (e) {
99
- return next(e)
100
- }
19
+ const RestAdapter = function(srv) {
20
+
21
+ alias2ref(srv) // REVISIT: that's an anti pattern in new prototocol adapter setups
22
+
23
+ const router = express.Router()
24
+
25
+ // -----------------------------------------------------------------------------------------
26
+ // service root
27
+ router.head('/', (_,res) => res.json({}))
28
+ router.get('/', (_,res) => res.json({
29
+ entities: Object.keys(srv.entities).map(e => ({ name:e, url:e }))
30
+ }))
31
+
32
+ // -----------------------------------------------------------------------------------------
33
+
34
+ // pass srv-related stuff to middlewares via req
35
+ router.use((req, res, next) => {
36
+ req._srv = srv // FIXME: That's only because of how we organized our rest adapater code into fragmented files -> don't do that
37
+
38
+ // cds/libx/rest/middleware/create.js:
39
+ // 12: const { _srv: srv, _query: query, _target, _data } = _req
40
+
41
+ // cds/libx/rest/middleware/delete.js:
42
+ // 4: const { _srv: srv, _query: query, _target, _params } = _req
43
+
44
+ // cds/libx/rest/middleware/error.js:
45
+ // 40: const { _srv: srv } = req
46
+
47
+ // cds/libx/rest/middleware/input.js:
48
+ // 40: const { _srv, _query, _data, _operation } = req
49
+ // 43: if (!(_data && _srv && definition)) return next()
50
+ // 47: const template = getTemplate(_cache(req), _srv, definition, { pick: _picker(req) })
51
+
52
+ // cds/libx/rest/middleware/operation.js:
53
+ // 7: const { _srv: srv, _query: query, _operation: operation, _data: data } = _req
101
54
 
102
- // TODO: cf. bufferToBase64() in old rest adapter
103
-
104
- // only set status if not yet modified
105
- if (status && res.statusCode === 200) res.status(status)
106
- if (location) res.set('location', location)
107
- if (req.method === 'HEAD')
108
- res
109
- .set({
110
- 'content-type': 'application/json; charset=utf-8',
111
- 'content-length': JSON.stringify(result).length
112
- })
113
- .end()
114
- // need to convert number to string because express interprets integer as status code
115
- else res.send(typeof result === 'number' ? result.toString() : result)
116
- })
117
- this.use('/', (err, req, res, next) => {
118
- // request may fail during processing or during commit -> both caught here
119
-
120
- // REVISIT: rollback needed if error occured before commit attempted -> how to distinguish?
121
- if (req._tx) req._tx.rollback(err).catch(() => {})
122
-
123
- next(err)
124
- })
125
-
126
- /*
127
- * error handling
128
- */
129
- this.use(error)
130
- }
55
+ // cds/libx/rest/middleware/parse.js:
56
+ // 10: const { _srv: service } = req
57
+
58
+ // cds/libx/rest/middleware/read.js:
59
+ // 4: const { _srv: srv, _query: query, _target, _params } = _req
60
+
61
+ // cds/libx/rest/middleware/update.js:
62
+ // 11: let { _srv: srv, _query: query, _target, _data, _params } = _req
63
+
64
+ next()
65
+ })
66
+
67
+ // req.user + req.tenant -> cds.context = { user, tenant }
68
+ // NOT ALLOWED: cds.context.user = 'me'
69
+ // req.requiresLogin() -> login -> redirect to referrer
70
+
71
+
72
+ // check @requires as soon as possible (DoS)
73
+ router.use((req, res, next) => { // REVISIT: This is authorization enforcement which is protocol-independent -> should move to service layer
74
+ const requires = srv.definition['@requires']
75
+ if (requires) {
76
+ const ok = typeof requires === 'string' ? req.user.is(requires) : requires.some(r => req.user.is(r))
77
+ if (ok) return next()
78
+ } else {
79
+ return next() // neither of the above
80
+ }
81
+
82
+ if (req.user._is_anonymous) { // > unauthorized or forbidden?
83
+ if (req.user._challenges) res.set('WWW-Authenticate', req.user._challenges.join(';')) //> REVISIT: is this for basic auth only? -> should be done differently
84
+ throw cds.error ('Unauthorized', { statusCode: 401, code: '401' }) //> UNAUTHORIZED
85
+ }
86
+ throw cds.error ('Forbidden', { statusCode: 403, code: '403' }) //> FORBIDDEN
87
+ // REVISIT: send res.status().json() instead of throwing exceptions
88
+ // REVISIT: security log?
89
+ })
90
+
91
+ // -----------------------------------------------------------------------------------------
92
+ // parse
93
+
94
+ // content-type check
95
+ router.use((req, res, next) => { // REVISIT: move that into parse function
96
+ if (req.method in { POST: 1, PUT: 1, PATCH: 1 }) {
97
+ const contentType = req.headers['content-type'] && req.headers['content-type'].split(';')
98
+ if (
99
+ contentType &&
100
+ (!contentType[0].match(/^application\/json$/) || (typeof contentType[1] === 'string' && !contentType[1]))
101
+ ) {
102
+ throw cds.error ('INVALID_CONTENT_TYPE_ONLY_JSON', { statusCode: 415, code: '415' }) // FIXME: better i18n + use res.status
103
+ }
104
+ if (req.method in { PUT: 1, PATCH: 1 } && Array.isArray(req.body)) {
105
+ throw cds.error (`INVALID_${req.method}`, { statusCode: 400, code: '400' }) // FIXME: better i18n + use res.status
106
+ }
107
+ }
108
+ next()
109
+ })
110
+ router.use(express.json()) // REVISIT: -> belongs to the parses
111
+ router.use(parse) // REVISIT: -> move to actual handler(s)
112
+ router.use(payload) // REVISIT: -> move?
113
+ // payload validation
114
+ router.use(input) // REVISIT: This is protocol-independent, isn't it? -> move to service layer
115
+
116
+ // -----------------------------------------------------------------------------------------
117
+ // begin tx
118
+ router.use((req, res, next) => { // REVISIT: -> move to actual handler(s)
119
+ // create tx and set as cds.context
120
+ // REVISIT: _model should not be necessary
121
+ // REVISIT: req._tx should not be used like that!
122
+ req.tx = cds.context = srv.tx({ user: req.user, req, res, _model: srv.model })
123
+ next()
124
+ })
125
+
126
+ // -----------------------------------------------------------------------------------------
127
+ // Actual handlers for HEAD, GET, PUT, POST, PATCH, DELETE
128
+ //
129
+ router.head('/*', (req, res, next) => {
130
+ read(req, res, next) // REVISIT: HEAD is doing a full read ?
131
+ })
132
+ router.post('/*', (req, res, next) => {
133
+ if (req._operation) operation(req, res, next)
134
+ else create(req, res, next)
135
+ })
136
+ router.get('/*', (req, res, next) => {
137
+ if (req._operation) operation(req, res, next)
138
+ else read(req, res, next)
139
+ })
140
+ router.put('/*', update)
141
+ router.patch('/*', update)
142
+ router.delete('/*', (req,res,next) => deleet(req,res).then(next).catch(next))
143
+
144
+
145
+ // -----------------------------------------------------------------------------------------
146
+ // end tx (i.e., commit or rollback)
147
+ router.use(async (req, res, next) => {
148
+ const { result, status, location } = req._result // REVISIT: Ugly voodoo _req._result channel -> eliminate
149
+
150
+ // unfortunately, express doesn't catch async errors -> try catch needed
151
+ try {
152
+ // REVISIT: req._tx should not be used like that!
153
+ await req.tx.commit(result)
154
+ } catch (e) {
155
+ return next(e)
156
+ }
157
+
158
+ // convert binaries
159
+ const definition = req._operation || req._query.__target
160
+ if (result && srv && definition) bufferToBase64(result, srv, definition)
161
+
162
+ // only set status if not yet modified
163
+ if (status && res.statusCode === 200) res.status(status) // REVISIT: Why only when res.statusCode === 200?
164
+ if (location) res.set('location', location) // REVISIT: When do we redirect?
165
+ if (req.method === 'HEAD') // REVISIT: Move that to the implementation of HEAD
166
+ res
167
+ .set({
168
+ 'content-type': 'application/json; charset=utf-8',
169
+ 'content-length': JSON.stringify(result).length
170
+ })
171
+ .end()
172
+ // need to convert number to string because express interprets integer as status code
173
+ else res.send(typeof result === 'number' ? result.toString() : result) // REVISIT: use req.json() instead?
174
+ })
175
+
176
+
177
+ // -----------------------------------------------------------------------------------------
178
+ // error handling
179
+ router.use((err, req, res, next) => { // REVISIT: should not be neccessary!
180
+ // request may fail during processing or during commit -> both caught here
181
+
182
+ // REVISIT: rollback needed if error occured before commit attempted -> how to distinguish?
183
+ // REVISIT: req._tx should not be used like that!
184
+ if (req.tx) req.tx.rollback(err).catch(() => {}) // REVISIT: silently ?!?
185
+
186
+ next(err)
187
+ })
188
+ router.use(error) // FIXME: nope -> call next()
189
+
190
+ return router
131
191
  }
132
192
 
133
193
  module.exports = RestAdapter
@@ -9,8 +9,8 @@ class RestRequest extends cds.Request {
9
9
  * propagate _ (i.e., req._ and, hence, req._.req/res)
10
10
  * -> in the old adapters this is also set in OdataRequest/RestRequest
11
11
  */
12
- Object.setPrototypeOf(this._, cds.context._)
13
-
12
+ Object.setPrototypeOf(this._, cds.context._) // REVISIT: We should avoid doing this
13
+ if (args._req) this._queryOptions = args._req.query
14
14
  /*
15
15
  * new req.res api [work in progress -> not official]:
16
16
  * - req.res.status(202)
@@ -24,6 +24,7 @@ class RestRequest extends cds.Request {
24
24
  status: s => (that._status = s),
25
25
  set: (k, v) => (that._headers[k] = v)
26
26
  }
27
+ // REVISIT: We should avoid all of the above, and hence eliminate this class completely
27
28
  }
28
29
  }
29
30
 
@@ -4,10 +4,12 @@ const { INSERT } = cds.ql
4
4
  const RestRequest = require('../RestRequest')
5
5
 
6
6
  const _error4 = rejected =>
7
- rejected.length > 1 ? { message: 'MULTIPLE_ERRORS', details: rejected.map(r => r.reason) } : rejected[0].reason
7
+ rejected.length > 1
8
+ ? Object.assign(new Error('MULTIPLE_ERRORS'), { details: rejected.map(r => r.reason) })
9
+ : rejected[0].reason
8
10
 
9
11
  module.exports = async (_req, _res, next) => {
10
- const { _srv: srv, _query: query, _target, _data } = _req
12
+ const { _srv: srv, _query: query, _target, _data, _params } = _req
11
13
 
12
14
  let result, location
13
15
 
@@ -18,7 +20,7 @@ module.exports = async (_req, _res, next) => {
18
20
  if (query.INSERT.entries.length > 1) {
19
21
  // > batch insert
20
22
  const reqs = query.INSERT.entries.map(
21
- entry => new RestRequest({ query: INSERT.into(query.INSERT.into).entries(entry), _target })
23
+ entry => new RestRequest({ query: INSERT.into(query.INSERT.into).entries(entry), _target, params: _params })
22
24
  )
23
25
  const ress = await Promise.allSettled(reqs.map(req => srv.dispatch(req)))
24
26
  const rejected = ress.filter(r => r.status === 'rejected')
@@ -26,15 +28,15 @@ module.exports = async (_req, _res, next) => {
26
28
  result = ress.map(r => r.value)
27
29
  } else {
28
30
  // > single insert
29
- const req = new RestRequest({ query, _target })
31
+ const req = new RestRequest({ query, _target, params: _params })
30
32
  result = await srv.dispatch(req)
31
- location = `../${req.entity.replace(srv.name + '.', '')}`
33
+ location = `../${req.entity.replace(srv.name + '.', '')}` // REVISIT: Is it guaranteed that the GET works? Why do we need relative urls?
32
34
  for (const k in req.target.keys) location += `/${result[k]}`
33
35
  }
34
36
  } catch (e) {
35
37
  return next(e)
36
38
  }
37
39
 
38
- _req._result = { result, status: 201, location }
40
+ _req._result = { result, status: 201, location } // REVISIT: Do a res.status(201).send(...) instead
39
41
  next()
40
42
  }
@@ -1,20 +1,13 @@
1
1
  const RestRequest = require('../RestRequest')
2
2
 
3
- module.exports = async (_req, _res, next) => {
3
+ module.exports = async (_req) => {
4
4
  const { _srv: srv, _query: query, _target, _params } = _req
5
5
 
6
- // unfortunately, express doesn't catch async errors -> try catch needed
7
- try {
8
- const req = new RestRequest({ query, _target })
6
+ const req = new RestRequest({ query, _target, params: _params })
9
7
 
10
- // req.data is filled with keys during read and delete
11
- if (_params) req.data = _params[_params.length - 1]
8
+ // req.data is filled with keys during read and delete
9
+ if (_params) req.data = _params[_params.length - 1] // REVISIT: We should avoid that!
12
10
 
13
- await srv.dispatch(req)
14
- } catch (e) {
15
- return next(e)
16
- }
17
-
18
- _req._result = { result: null, status: 204 }
19
- next()
11
+ await srv.dispatch(req)
12
+ _req._result = { result: null, status: 204 } // REVISIT: Ugly voodoo _re._result channel -> eliminate
20
13
  }
@@ -44,8 +44,8 @@ module.exports = (err, req, res, next) => {
44
44
  if (!ctx) {
45
45
  // > error before req was dispatched
46
46
  ctx = new cds.Request({ req, res: req.res, user: req.user || new cds.User.Anonymous() })
47
- for (const each of srv._handlers._error) each.handler.call(srv, err, ctx)
48
47
  }
48
+ for (const each of srv._handlers._error) each.handler.call(srv, err, ctx)
49
49
 
50
50
  // log the error (4xx -> warn)
51
51
  _log(err)
@@ -4,13 +4,16 @@ const templateProcessor = require('../../_runtime/common/utils/templateProcessor
4
4
  const { checkStaticElementByKey, assertNotNullError } = require('../../_runtime/cds-services/util/assert')
5
5
  const { MULTIPLE_ERRORS } = require('../../_runtime/common/error/constants')
6
6
 
7
- const _picker = req => {
8
- const skipKeyValidation = req.method !== 'POST'
7
+
8
+ //
9
+ // REVISIT: We need to decipher what we are doing here...
10
+ //
11
+
12
+ const _picker = () => {
9
13
  return element => {
10
14
  const categories = {}
11
15
  if (Array.isArray(element)) return
12
16
  if (element._isStructured || element.isAssociation || element.items) return
13
- if (!skipKeyValidation && element.key) categories['key_validation'] = true
14
17
  categories['static_validation'] = true
15
18
  return categories
16
19
  }
@@ -23,9 +26,6 @@ const _processorFn = errors => {
23
26
  const validations = checkStaticElementByKey(target, key, row[key])
24
27
  errors.push(...validations)
25
28
  }
26
- if (categories['key_validation'] && !(key in row)) {
27
- errors.push(assertNotNullError(element))
28
- }
29
29
  }
30
30
  }
31
31
 
@@ -4,15 +4,15 @@ const { validateReturnType } = require('../../_runtime/cds-services/adapter/rest
4
4
  const RestRequest = require('../RestRequest')
5
5
 
6
6
  module.exports = async (_req, _res, next) => {
7
- const { _srv: srv, _query: query, _operation: operation, _data: data } = _req
7
+ const { _srv: srv, _query: query, _operation: operation, _data: data, _params } = _req
8
8
 
9
9
  let result
10
10
 
11
11
  // unfortunately, express doesn't catch async errors -> try catch needed
12
12
  try {
13
13
  const req = query
14
- ? new RestRequest({ query, event: operation.name, data })
15
- : new RestRequest({ event: operation.name.replace(`${srv.name}.`, ''), data })
14
+ ? new RestRequest({ query, event: operation.name, data, params: _params })
15
+ : new RestRequest({ event: operation.name.replace(`${srv.name}.`, ''), data, params: _params })
16
16
  result = await srv.dispatch(req)
17
17
  } catch (e) {
18
18
  return next(e)
@@ -41,6 +41,11 @@ module.exports = async (_req, _res, next) => {
41
41
  return next(e)
42
42
  }
43
43
 
44
+ // mtx compat, modeled as string but object returned
45
+ if (operation.returns._type === 'cds.String' && typeof result === 'object') {
46
+ _res.set('content-type', 'application/json')
47
+ }
48
+
44
49
  // REVISIT: still needed?
45
50
  if (!operation.returns.items && Array.isArray(result)) result = result[0]
46
51
 
@@ -70,7 +70,7 @@ module.exports = (req, res, next) => {
70
70
  default:
71
71
  // anything to do?
72
72
  }
73
- req._query = query
73
+ req._query = query // REVISIT: req._query should not be a standard API
74
74
  if (query) req._query.__target = definition
75
75
 
76
76
  // REVISIT: query._data hack
@@ -79,7 +79,7 @@ module.exports = (req, res, next) => {
79
79
  req._data = {}
80
80
  } else {
81
81
  const payload = deepCopy(args || req.body)
82
- convertStructured(service, operation || definition, payload)
82
+ convertStructured(service, operation || definition, payload, { cleanupStruct: cds.env.features.rest_struct_data })
83
83
  req._data = payload
84
84
  }
85
85
  }
@@ -88,7 +88,7 @@ module.exports = (req, res, next) => {
88
88
  for (let i = 0; i < _target.ref.length; i++) {
89
89
  req._params = req._params || []
90
90
  if (_target.ref[i].where) req._params.push(where2obj(_target.ref[i].where))
91
- else req._params.push({})
91
+ else if (_target.ref.length !== 1) req._params.push({})
92
92
  }
93
93
 
94
94
  next()
@@ -0,0 +1,12 @@
1
+ const { base64ToBuffer } = require('../../_runtime/common/utils/binary')
2
+
3
+ module.exports = (req, res, next) => {
4
+ const { _srv, _query, _data, _operation } = req
5
+ const definition = _operation || _query.__target
6
+
7
+ if (!(_data && _srv && definition)) return next()
8
+
9
+ base64ToBuffer(_data, _srv, definition)
10
+
11
+ next()
12
+ }
@@ -8,7 +8,7 @@ module.exports = async (_req, _res, next) => {
8
8
 
9
9
  // unfortunately, express doesn't catch async errors -> try catch needed
10
10
  try {
11
- const req = new RestRequest({ query, _target })
11
+ const req = new RestRequest({ query, _target, params: _params, _req })
12
12
 
13
13
  // req.data is filled with keys during read and delete
14
14
  if (_params) req.data = _params[_params.length - 1]
@@ -23,7 +23,17 @@ module.exports = async (_req, _res, next) => {
23
23
  } catch (e) {
24
24
  return next(e)
25
25
  }
26
-
26
+ // compat for mtx returning strings instead of objects
27
+ if (typeof result === 'object' && result !== null && '$count' in result) {
28
+ result = {
29
+ count: result.$count,
30
+ value: result
31
+ }
32
+ } else if (typeof result === 'number') {
33
+ // TODO check if this is needed
34
+ result = result.toString()
35
+ }
27
36
  _req._result = { result, status }
37
+
28
38
  next()
29
39
  }
@@ -20,14 +20,14 @@ module.exports = async (_req, _res, next) => {
20
20
  // add the data (as copy, if upsert allowed)
21
21
  query.with(UPSERT_ALLOWED ? deepCopyObject(_data) : _data)
22
22
  // REVISIT: if PUT, req.method should be PUT -> Crud2Http maps UPSERT to PUT
23
- result = await srv.dispatch(new RestRequest({ query, _target, method: _req.method }))
24
- if (_params) Object.assign(result, _params[_params.length - 1])
23
+ result = await srv.dispatch(new RestRequest({ query, _target, method: _req.method, params: _params }))
24
+ if (_params && result) Object.assign(result, _params[_params.length - 1])
25
25
  } catch (e) {
26
26
  if ((e.code === 404 || e.status === 404 || e.statusCode === 404) && UPSERT_ALLOWED) {
27
27
  query = INSERT.into(query.UPDATE.entity).entries(
28
28
  _params ? Object.assign(_data, _params[_params.length - 1]) : _data
29
29
  )
30
- result = await srv.dispatch(new RestRequest({ query, _target }))
30
+ result = await srv.dispatch(new RestRequest({ query, _target, params: _params }))
31
31
  status = 201
32
32
  } else {
33
33
  throw e
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sap/cds",
3
- "version": "5.9.8",
3
+ "version": "6.0.1",
4
4
  "description": "SAP Cloud Application Programming Model - CDS for Node.js",
5
5
  "homepage": "https://cap.cloud.sap/",
6
6
  "keywords": [
@@ -27,13 +27,11 @@
27
27
  "LICENSE"
28
28
  ],
29
29
  "engines": {
30
- "node": ">=12.18"
30
+ "node": ">=14.15.0"
31
31
  },
32
32
  "dependencies": {
33
- "@sap-cloud-sdk/core": "^1.41",
34
- "@sap-cloud-sdk/util": "^1.41",
35
- "@sap/cds-compiler": "^2.13.0",
36
- "@sap/cds-foss": "^3"
33
+ "@sap/cds-compiler": ">=2.13.0",
34
+ "@sap/cds-foss": ">=3"
37
35
  },
38
36
  "husky": {
39
37
  "hooks": {