@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
@@ -1,50 +0,0 @@
1
- const _isKeyTypeBinary = (entity, key) => {
2
- return (
3
- entity.elements &&
4
- entity.elements[key] &&
5
- (entity.elements[key]._type === 'cds.Binary' || entity.elements[key]._type === 'cds.LargeBinary')
6
- )
7
- }
8
-
9
- const base64toBuffer = (json, entity) => {
10
- if (typeof json !== 'object') {
11
- return
12
- }
13
-
14
- for (const key in json) {
15
- if (_isKeyTypeBinary(entity, key) && json[key]) {
16
- json[key] = Buffer.from(json[key], 'base64')
17
- }
18
- }
19
- }
20
-
21
- const _arrayToBase64 = (json, entity) => {
22
- json.forEach(element => {
23
- if (typeof element === 'object') {
24
- bufferToBase64(element, entity)
25
- }
26
- })
27
- }
28
-
29
- const _objectToBase64 = (json, entity) => {
30
- for (const key in json) {
31
- if (_isKeyTypeBinary(entity, key) && json[key]) {
32
- json[key] = json[key].toString('base64')
33
- }
34
- }
35
- }
36
-
37
- const bufferToBase64 = (json, entity) => {
38
- if (typeof json !== 'object') return
39
-
40
- if (Array.isArray(json)) {
41
- _arrayToBase64(json, entity)
42
- } else {
43
- _objectToBase64(json, entity)
44
- }
45
- }
46
-
47
- module.exports = {
48
- base64toBuffer,
49
- bufferToBase64
50
- }
@@ -1,117 +0,0 @@
1
- const { getKeyValuePair } = require('./key-value-utils')
2
- const { validationChecks } = require('./validation-checks')
3
- const { checkComplexType } = require('../../../util/assert')
4
- const { deepCopyObject, deepCopyArray } = require('../../../../common/utils/copy')
5
-
6
- const _getKeyValues = (event, target, keys) => {
7
- if (event === 'CREATE' && !keys) return {}
8
- return getKeyValuePair(target, keys)
9
- }
10
-
11
- const _isPrimitiveProperty = ([key], elements) => {
12
- return elements[key] && !elements[key].isAssociation
13
- }
14
-
15
- const _addPrimitiveProperty = (row, [key, value]) => {
16
- row[key] = value
17
- }
18
-
19
- const _addComplexProperty = (row, [structuredName, structuredValue], elements) => {
20
- // Limited to depth 1, same as for checkComplexType
21
- const nestedObj = {}
22
- for (const [structuredElement, structuredElementValue] of Object.entries(structuredValue)) {
23
- if (elements[`${structuredName}_${structuredElement}`]) {
24
- nestedObj[structuredElement] = structuredElementValue
25
- }
26
- }
27
- row[structuredName] = nestedObj
28
- }
29
-
30
- const _isCompositionProperty = ([key, value], elements) => {
31
- return elements[key] && elements[key].isComposition && value
32
- }
33
-
34
- const _addCompositionProperty = (row, [key, value], elements) => {
35
- const target = elements[key]._target
36
-
37
- if (Array.isArray(value)) {
38
- row[key] = []
39
- for (const child of value) {
40
- const filteredChild = {}
41
- _copyAndFilterDeep(filteredChild, [child], target)
42
- row[key].push(filteredChild)
43
- }
44
- } else {
45
- row[key] = {}
46
- _copyAndFilterDeep(row[key], [value], target)
47
- }
48
- }
49
-
50
- const _copyAndFilterDeep = (copy, data, entity) => {
51
- if (!Array.isArray(data)) data = [data]
52
-
53
- data.forEach(dataEntry => {
54
- let row
55
- if (Array.isArray(copy)) {
56
- row = {}
57
- copy.push(row)
58
- } else {
59
- row = copy
60
- }
61
-
62
- for (const prop of Object.entries(dataEntry)) {
63
- const elements = entity.elements
64
-
65
- if (_isPrimitiveProperty(prop, elements)) {
66
- _addPrimitiveProperty(row, prop)
67
- } else if (checkComplexType(prop, elements, false)) {
68
- _addComplexProperty(row, prop, elements)
69
- } else if (_isCompositionProperty(prop, elements)) {
70
- _addCompositionProperty(row, prop, elements)
71
- }
72
- }
73
- })
74
- }
75
-
76
- const _getFilteredCopy = (target, data, keyValues) => {
77
- let copy
78
-
79
- if (!target || target._hasPersistenceSkip) {
80
- // > unbound or @cds.persistence.skip
81
- copy = Array.isArray(data) ? deepCopyArray(data) : deepCopyObject(data)
82
- } else {
83
- // > bound (incl. CRUD) and no @cds.persistence.skip
84
- copy = Array.isArray(data) ? [] : {}
85
- _copyAndFilterDeep(copy, data, target)
86
- }
87
-
88
- if (keyValues) {
89
- Array.isArray(data) ? Object.assign(copy[0], keyValues) : Object.assign(copy, keyValues)
90
- }
91
-
92
- return copy
93
- }
94
-
95
- module.exports = (parsed, restReq) => {
96
- const { event, kind, segments, target, params } = parsed
97
-
98
- let data, keyValues
99
- if (kind) {
100
- // > action or function
101
- data = params || restReq.body || {}
102
- } else {
103
- // > CRUD
104
- keyValues = _getKeyValues(event, target, segments[1])
105
- if (event === 'CREATE') {
106
- // > batch
107
- data = Array.isArray(restReq.body) ? restReq.body : [restReq.body || {}]
108
- } else {
109
- data = restReq.body || {}
110
- }
111
- }
112
-
113
- const err = validationChecks(event, data, target && target.elements ? target : { elements: segments[0].params })
114
-
115
- if (err) return [err]
116
- else return [0, _getFilteredCopy(target, data, keyValues)]
117
- }
@@ -1,14 +0,0 @@
1
- const getError = require('../../../../common/error')
2
-
3
- const contentTypeCheck = req => {
4
- const contentType = req.headers['content-type'] && req.headers['content-type'].split(';')
5
- if (
6
- contentType &&
7
- (!contentType[0].match(/^application\/json$/) || (typeof contentType[1] === 'string' && !contentType[1]))
8
- ) {
9
- throw getError(415, 'INVALID_CONTENT_TYPE_ONLY_JSON')
10
- }
11
- }
12
- module.exports = {
13
- contentTypeCheck
14
- }
@@ -1,30 +0,0 @@
1
- const _keyFromEntity = entity => {
2
- const keyName = Object.keys(entity.keys)[0]
3
- return entity.keys[keyName]
4
- }
5
-
6
- const getConvertedValue = (type, value) => {
7
- // TODO: part of input validation?
8
- // TODO: what to do with binaries (Buffer?!)
9
- switch (type) {
10
- case 'cds.Boolean':
11
- return value === 'true'
12
- case 'cds.Integer':
13
- case 'cds.Integer64':
14
- case 'cds.Decimal':
15
- case 'cds.DecimalFloat':
16
- case 'cds.Double':
17
- return Number(value)
18
- default:
19
- return value
20
- }
21
- }
22
-
23
- module.exports = {
24
- getKeyValuePair: (entity, value) => {
25
- if (value === undefined) return {}
26
- const key = _keyFromEntity(entity)
27
- return { [key.name]: getConvertedValue(key._type, value) }
28
- },
29
- getConvertedValue
30
- }
@@ -1,250 +0,0 @@
1
- const getError = require('../../../../common/error')
2
- const { getConvertedValue } = require('./key-value-utils')
3
- const { checkStatic } = require('../../../util/assert')
4
- const { findCsnTargetFor } = require('../../../../common/utils/csn')
5
-
6
- const _normalizeAndSplitUrl = req => {
7
- // Normalize /path////to/someWhere into path/to/someWhere and split by /
8
- const parts = `/${req.path}/`
9
- .replace(/[/]+/g, '/')
10
- .replace(/\/(.*)\//, '$1')
11
- .split('/')
12
-
13
- // TODO: replace with generic solution, currently we do not support longer urls
14
- if (parts.length > 3) {
15
- throw getError(501, 'CRUD_VIA_NAVIGATION_NOT_SUPPORTED')
16
- }
17
-
18
- return parts
19
- }
20
-
21
- const _enrichCustomOperation = (csnElement, customOperationName) => {
22
- const obj = { name: customOperationName }
23
- Object.setPrototypeOf(obj, csnElement)
24
- return obj
25
- }
26
-
27
- const _initializeParsed = event => {
28
- return { event, segments: [] }
29
- }
30
-
31
- const _parseEntityOrOperation = part => {
32
- let decodedPart = decodeURI(part)
33
- decodedPart = decodedPart.replace(/"/gi, '')
34
- const [, name, paramsString = ''] = decodedPart.match(/([^(]+)\(?(.*[^)]+)?\)?/)
35
- const params = paramsString
36
- .split(',')
37
- .map(keyValue => keyValue.split('='))
38
- .reduce((obj, [key, value]) => {
39
- if (key) {
40
- obj[key] = value
41
- }
42
- return obj
43
- }, {})
44
- const returnObj = { name }
45
- if (Object.keys(params).length > 0) {
46
- returnObj.params = params
47
- }
48
- return returnObj
49
- }
50
-
51
- const _findEntityOrCustomOperation = (customOperation, service, name) => {
52
- const thing =
53
- service.entities[name] || service.operations[name] || findCsnTargetFor(name, service.model, service.namespace)
54
- if (!thing) {
55
- throw getError(404, 'INVALID_RESOURCE', [name])
56
- }
57
-
58
- if (thing.kind === 'entity') {
59
- return thing
60
- }
61
-
62
- if (thing.kind === customOperation) {
63
- return _enrichCustomOperation(thing, name)
64
- }
65
-
66
- throw getError(400, 'INVALID_RESOURCE', [name])
67
- }
68
-
69
- const _validateEntity = entity => {
70
- if (!entity) {
71
- throw getError(404)
72
- }
73
-
74
- if (entity.kind === 'entity') {
75
- return entity
76
- }
77
-
78
- throw getError(400, 'INVALID_RESOURCE', [entity.name])
79
- }
80
-
81
- const _validateCustomOperation = (entity, name, customOperation) => {
82
- if (entity.actions && entity.actions[name] && entity.actions[name].kind === customOperation) {
83
- return _enrichCustomOperation(entity.actions[name], name)
84
- } else if (entity.elements && entity.elements[name] && entity.elements[name]._isAssociationEffective) {
85
- // REVISIT hack to at least support one step navigations
86
- return _enrichCustomOperation(entity.elements[name], name)
87
- }
88
-
89
- throw getError(400, 'INVALID_OPERATION_FOR_ENTITY', [entity.name, customOperation.toUpperCase(), name])
90
- }
91
-
92
- const _validateAndConvertParamValues = (csnElement, params = {}) => {
93
- for (const param in params) {
94
- const csnElementParam = csnElement.params[param]
95
- if (!csnElementParam) {
96
- throw getError(400, 'INVALID_PARAMETER', [param])
97
- }
98
- const convertedParam = getConvertedValue(csnElementParam._type, params[param])
99
- if (Number.isNaN(convertedParam)) {
100
- throw getError(400, 'INVALID_PARAMETER_VALUE_TYPE', [param, csnElementParam._type])
101
- }
102
- params[param] = convertedParam
103
- }
104
- checkStatic({ elements: csnElement.params }, params)
105
- }
106
-
107
- const _getLastEntity = segments => {
108
- let last
109
- for (let i = segments.length - 1; i >= 0; i--) {
110
- if (segments[i].target) {
111
- last = segments[i].target
112
- break
113
- } else if (segments[i].kind === 'entity') {
114
- last = segments[i]
115
- break
116
- }
117
- }
118
- return last
119
- }
120
-
121
- const _setConvenienceProperties = parsed => {
122
- const lastElement = parsed.segments[parsed.segments.length - 1]
123
-
124
- if (typeof lastElement === 'string') {
125
- parsed.isCollection = false
126
- } else if (lastElement.kind === 'entity') {
127
- parsed.isCollection = true
128
- } else if (lastElement.isAssociation) {
129
- parsed.isCollection = true
130
- } else {
131
- parsed.operation = lastElement
132
- parsed.kind = lastElement.kind
133
- parsed.event = lastElement.name
134
- }
135
-
136
- parsed.target = _getLastEntity(parsed.segments)
137
- }
138
-
139
- const _parseCreateOrRead1 = (parts, customOperation, service, parsed) => {
140
- const { name, params } = _parseEntityOrOperation(parts[0])
141
- const entityOrCustomOperation = _findEntityOrCustomOperation(customOperation, service, name)
142
- if (params) {
143
- _validateAndConvertParamValues(entityOrCustomOperation, params)
144
- }
145
- if (params && customOperation === 'function') {
146
- parsed.params = params
147
- }
148
- parsed.segments.push(entityOrCustomOperation)
149
- }
150
-
151
- const _parseCreateOrRead2 = (event, parsed, service, parts) => {
152
- if (event === 'CREATE') {
153
- throw getError(400, 'INVALID_POST')
154
- }
155
-
156
- parsed.segments.push(
157
- _validateEntity(service.entities[parts[0]] || findCsnTargetFor(parts[0], service.model, service.namespace)),
158
- parts[1]
159
- )
160
- }
161
-
162
- const _parseCreateOrRead3 = (service, parts, customOperation, parsed) => {
163
- const entity = _validateEntity(
164
- service.entities[parts[0]] || findCsnTargetFor(parts[0], service.model, service.namespace)
165
- )
166
- const key = parts[1]
167
- const { name, params } = _parseEntityOrOperation(parts[2])
168
- const operation = _validateCustomOperation(entity, name, customOperation)
169
- if (params) {
170
- _validateAndConvertParamValues(operation, params)
171
- }
172
- if (params && customOperation === 'function') {
173
- parsed.params = params
174
- }
175
- parsed.segments.push(entity, key, operation)
176
- }
177
-
178
- const parseCreateOrReadUrl = (event, service, req) => {
179
- const parts = _normalizeAndSplitUrl(req)
180
- const customOperation = event === 'READ' ? 'function' : 'action'
181
- const parsed = _initializeParsed(event)
182
-
183
- // TODO: replace with generic solution
184
- if (parts.length === 1) {
185
- _parseCreateOrRead1(parts, customOperation, service, parsed)
186
- }
187
-
188
- if (parts.length === 2) {
189
- _parseCreateOrRead2(event, parsed, service, parts)
190
- }
191
-
192
- if (parts.length === 3) {
193
- _parseCreateOrRead3(service, parts, customOperation, parsed)
194
- }
195
-
196
- _setConvenienceProperties(parsed)
197
- if (typeof parsed.target === 'string') parsed.target = service.model.definitions[parsed.target]
198
-
199
- return parsed
200
- }
201
-
202
- const parseUpdateOrDeleteUrl = (event, service, req) => {
203
- const parts = _normalizeAndSplitUrl(req)
204
-
205
- // TODO: replace with generic solution
206
- if (req.method === 'DELETE' && parts.length !== 2) {
207
- throw getError(400, 'INVALID_DELETE')
208
- }
209
- if (req.method === 'PATCH' && parts.length !== 2) {
210
- throw getError(400, 'INVALID_PATCH')
211
- }
212
- if (req.method === 'PUT' && parts.length !== 2) {
213
- throw getError(400, 'INVALID_PUT')
214
- }
215
-
216
- const entity = _validateEntity(
217
- service.entities[parts[0]] || findCsnTargetFor(parts[0], service.model, service.namespace)
218
- )
219
- const segments = [entity]
220
-
221
- if (parts[1]) {
222
- segments.push(parts[1])
223
- }
224
-
225
- let target = _getLastEntity(segments)
226
- if (typeof target === 'string') target = service.model.definitions[target]
227
-
228
- return { event, segments, target }
229
- }
230
-
231
- module.exports = {
232
- POST: (service, req) => {
233
- return parseCreateOrReadUrl('CREATE', service, req)
234
- },
235
- HEAD: (service, req) => {
236
- return parseCreateOrReadUrl('READ', service, req)
237
- },
238
- GET: (service, req) => {
239
- return parseCreateOrReadUrl('READ', service, req)
240
- },
241
- PUT: (service, req) => {
242
- return parseUpdateOrDeleteUrl('UPDATE', service, req)
243
- },
244
- PATCH: (service, req) => {
245
- return parseUpdateOrDeleteUrl('UPDATE', service, req)
246
- },
247
- DELETE: (service, req) => {
248
- return parseUpdateOrDeleteUrl('DELETE', service, req)
249
- }
250
- }
@@ -1,26 +0,0 @@
1
- /**
2
- * Convert any result to the format expected of rest.
3
- *
4
- * @param {*} result
5
- * @returns {string | object | boolean}
6
- */
7
- const toRestResult = result => {
8
- let restResult = result
9
-
10
- // compat for mtx returning strings instead of objects
11
- if (typeof result === 'object' && '$count' in result) {
12
- restResult = {
13
- count: result.$count,
14
- value: result
15
- }
16
- // need to convert number to string because express interprets integer as status code
17
- } else if (typeof result === 'number') {
18
- restResult = result.toString()
19
- }
20
-
21
- return restResult
22
- }
23
-
24
- module.exports = {
25
- toRestResult
26
- }
@@ -1,200 +0,0 @@
1
- const cds = require('../../../cds')
2
- const { SELECT } = cds.ql
3
-
4
- const { processDeep } = require('../../util/dataProcessUtils')
5
-
6
- const { DRAFT_COLUMNS_MAP } = require('../../../common/constants/draft')
7
-
8
- const _isAssociationToOneManaged = element => element._isAssociationEffective && element.is2one && !element.on
9
-
10
- const _getWheres = (key, data) => {
11
- const wheres = []
12
- for (const d of data) {
13
- wheres.push({ [key.name]: d[key.name] })
14
- }
15
- return wheres
16
- }
17
-
18
- const allKeysAreProvided = req => {
19
- const data = req.data && (Array.isArray(req.data) ? req.data : [req.data])
20
- for (const key of Object.values(req.target.keys || {})) {
21
- if (key._isAssociationStrict || key.name in DRAFT_COLUMNS_MAP) {
22
- continue
23
- }
24
- for (const d of data) {
25
- if (d[key.name] === undefined) return false
26
- }
27
- }
28
- return true
29
- }
30
-
31
- const _addWhereToCqn = (wheres, target, cqn) => {
32
- if (wheres.length === 1) {
33
- const whereObj = wheres[0]
34
- for (const key in whereObj) {
35
- // check if we have structured elements
36
- if (target.elements[key].elements) {
37
- whereObj[key] = { val: JSON.stringify(whereObj[key]) }
38
- }
39
- }
40
- cqn.where(whereObj)
41
- } else {
42
- cqn.where({ or: wheres })
43
- }
44
- }
45
-
46
- const _getSelectCQN = (req, columns) => {
47
- const cqn = SELECT.from(req.target)
48
-
49
- if (columns) {
50
- cqn.columns(...columns)
51
- }
52
-
53
- const data = req.data && (Array.isArray(req.data) ? req.data : [req.data])
54
-
55
- for (const key of Object.values(req.target.keys || {})) {
56
- if (key._isAssociationStrict || key.name in DRAFT_COLUMNS_MAP) {
57
- continue
58
- }
59
-
60
- const wheres = _getWheres(key, data)
61
- if (wheres.length) {
62
- _addWhereToCqn(wheres, req.target, cqn)
63
- }
64
- }
65
-
66
- if (req.target.query && req.target.query.SELECT && req.target.query.SELECT.orderBy) {
67
- cqn.SELECT.orderBy = req.target.query.SELECT.orderBy
68
- }
69
-
70
- return cqn
71
- }
72
-
73
- function _fillForeignKeysWithNull(managedAssocToOneElement, row) {
74
- for (const key of managedAssocToOneElement._foreignKeys) {
75
- if (key.parentElement) row[key.parentElement.name] = null
76
- }
77
- }
78
-
79
- const _flattenManagedToOneAssociation = (managedAssocToOneElement, entity, row, property, csn, req) => {
80
- const targetEntity = managedAssocToOneElement._target
81
- for (const key in targetEntity.keys) {
82
- const el = targetEntity.keys[key]
83
- if (_isAssociationToOneManaged(el)) {
84
- if (row[managedAssocToOneElement.name] === null) {
85
- _fillForeignKeysWithNull(managedAssocToOneElement, row)
86
- continue
87
- }
88
- _flattenManagedToOneAssociation(el, targetEntity, row[managedAssocToOneElement.name], key, csn, req)
89
- continue
90
- }
91
-
92
- if (row[managedAssocToOneElement.name] === null) {
93
- row[managedAssocToOneElement.name + '_' + key] = null
94
- } else {
95
- row[managedAssocToOneElement.name + '_' + key] = row[managedAssocToOneElement.name][key]
96
- delete row[managedAssocToOneElement.name][key]
97
- }
98
- }
99
-
100
- if (row[managedAssocToOneElement.name] === null || Object.keys(row[managedAssocToOneElement.name]).length === 0) {
101
- // if there are no non key values left, remove assoc object
102
- delete row[managedAssocToOneElement.name]
103
- }
104
- }
105
-
106
- const _flattenDeepToOneAssociations = (entity, data, csn, req) => {
107
- if (!Array.isArray(data)) {
108
- return _flattenDeepToOneAssociations(entity, [data], csn, req)
109
- }
110
-
111
- for (const row of data) {
112
- for (const property in row) {
113
- const element = entity.elements[property]
114
- if (!element) continue
115
-
116
- if (_isAssociationToOneManaged(element)) {
117
- _flattenManagedToOneAssociation(element, entity, row, property, csn, req)
118
- } else if (element.elements) {
119
- _flattenDeepToOneAssociations(element, [row[element.name]], csn, req)
120
- }
121
- }
122
- }
123
- }
124
-
125
- const flattenDeepToOneAssociations = (req, csn) => {
126
- if (!req.target) {
127
- return
128
- }
129
-
130
- if (req.event !== 'CREATE' && req.event !== 'UPDATE') {
131
- return
132
- }
133
-
134
- // REVISIT: adopt template mechanism?
135
- processDeep(
136
- (data, entity) => {
137
- _flattenDeepToOneAssociations(entity, data, csn, req)
138
- },
139
- req.data,
140
- req.target,
141
- false,
142
- true
143
- )
144
- }
145
-
146
- /*
147
- * merge CQNs
148
- */
149
- const _mergeExpandCQNs = cqns => {
150
- const cols = cqns[0].SELECT.columns
151
- for (const c of cqns) {
152
- for (const col of c.SELECT.columns) {
153
- if (col.expand && !cols.find(ele => ele.ref[0] === col.ref[0])) {
154
- cols.push(col)
155
- }
156
- }
157
- }
158
- return cqns[0]
159
- }
160
-
161
- /*
162
- * recursively builds a select cqn for deep read after write
163
- * (depth determined by req.data)
164
- */
165
- const getDeepSelect = req => {
166
- // REVISIT: Why do we do such expensive deep reads after write at all ???
167
- const { elements } = req.target
168
- const cols = []
169
-
170
- for (const each in elements) {
171
- if (each in DRAFT_COLUMNS_MAP) continue
172
- const e = elements[each]
173
- if (!e.isAssociation) cols.push(each)
174
- else if (e._isCompositionEffective) {
175
- const cqns = []
176
- // REVISIT: This recursively creates lots of nested selects only to keep a few
177
- for (const row of Array.isArray(req.data) ? req.data : [req.data]) {
178
- let d = row[each]
179
- if (!d) continue
180
- else if (!Array.isArray(d)) d = [d]
181
- else if (d.length === 0) continue
182
- const nested = d.map(data => getDeepSelect({ target: e._target, data }))
183
- cqns.push(_mergeExpandCQNs(nested))
184
- }
185
- if (cqns.length > 0) {
186
- const { SELECT } = _mergeExpandCQNs(cqns)
187
- cols.push({ ref: [each], expand: SELECT.columns })
188
- }
189
- }
190
- }
191
-
192
- // root? -> with where clause
193
- return req.event ? _getSelectCQN(req, cols) : SELECT.from(req.target, cols)
194
- }
195
-
196
- module.exports = {
197
- getDeepSelect,
198
- allKeysAreProvided,
199
- flattenDeepToOneAssociations
200
- }