@sap/cds 5.9.6 → 6.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (381) hide show
  1. package/CHANGELOG.md +266 -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 +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 +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 +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 +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 +16 -18
  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 +11 -4
  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
package/server.js CHANGED
@@ -20,13 +20,12 @@ const express = require('express')
20
20
  * @param {express.Application} options.app - filenames of models to load; default: '*'
21
21
  * @param {express.Handler} options.index - custom handler for /
22
22
  * @param {express.Handler} options.favicon - custom handler for /favicon.ico
23
- * @param {express.Handler} options.logger - custom request logger middleware
24
23
  * @returns Promise resolving to a Node.js http server as returned by express' `app.listen()`.
25
24
  */
26
25
  module.exports = async function cds_server (options) {
27
26
 
28
27
  const _in_prod = process.env.NODE_ENV === 'production'
29
- const o = cds.options = { ...options, __proto__:defaults }
28
+ const o = { ...options, __proto__:defaults }
30
29
 
31
30
  const app = cds.app = o.app || express()
32
31
  app.serve = _app_serve //> app.serve allows delegating to sub modules
@@ -38,27 +37,21 @@ module.exports = async function cds_server (options) {
38
37
  if (o.favicon) app.use ('/favicon.ico', o.favicon) //> if none in ./app
39
38
  if (o.index) app.get ('/',o.index) //> if none in ./app
40
39
  if (o.correlate) app.use (o.correlate) //> request correlation
41
- if (o.logger) app.use (o.logger) //> basic request logging
42
- if (o.toggler) app.use (o.toggler) //> feature toggler
43
40
 
44
41
  // load specified models or all in project
45
42
  const csn = await cds.load(o.from||'*',o) .then (cds.minify) //> separate csn for _init_db
46
43
  cds.model = cds.compile.for.nodejs(csn)
47
44
 
48
45
  // connect to essential framework services if required
49
- if (cds.requires.extensibility) await _extensibility() //> has to go first
50
46
  if (cds.requires.db) cds.db = await cds.connect.to ('db') .then (_init)
51
47
  if (cds.requires.messaging) await cds.connect.to ('messaging')
52
- if (cds.requires.multitenancy) await _multitenancy()
53
- if (cds.requires.toggles) await _model_provider()
54
48
 
55
49
  // serve all services declared in models
56
- if (features.graphql) serve_graphql(app)
57
50
  await cds.serve (o.service,o) .in (app)
58
51
  await cds.emit ('served', cds.services) //> hook for listeners
59
52
 
60
53
  // start http server
61
- const port = (o.port !== undefined) ? o.port : (process.env.PORT || 4004)
54
+ const port = (o.port !== undefined) ? o.port : (process.env.PORT || cds.env.server?.port || 4004)
62
55
  return app.listen (port)
63
56
 
64
57
  // bootstrap in-memory db
@@ -71,12 +64,6 @@ module.exports = async function cds_server (options) {
71
64
 
72
65
  }
73
66
 
74
- // REVISIT: Move these out of here...
75
- const _model_provider = () => require('./libx/_runtime/extensibility/mps')
76
- const _extensibility = () => require('./libx/_runtime/extensibility/uiflex')
77
- const _multitenancy = () => features.streamlined_mtx ? _model_provider() : cds.mtx.in (cds.app)
78
-
79
-
80
67
 
81
68
  // -------------------------------------------------------------------------
82
69
  // Default handlers, which can be overidden by options passed to the server
@@ -97,25 +84,7 @@ const defaults = {
97
84
  get favicon() {
98
85
  const favicon = require.resolve ('./app/favicon.ico')
99
86
  return express.static (favicon, {maxAge:'14d'})
100
- },
101
-
102
- // default request logger
103
- get logger() {
104
- const LOG = cds.log(), DEBUG = cds.debug('server')
105
- return (req,_,next) => {
106
- LOG && LOG (req.method, decodeURI(req.url), req.body||'')
107
- if (/\$batch/.test(req.url)) req.on ('dispatch', (req) => {
108
- LOG && LOG ('>', req.event, decodeURI(req._path), req._query||'')
109
- if (DEBUG && req.query) DEBUG (req.query)
110
- })
111
- next()
112
- }
113
- },
114
-
115
- // feature toggler
116
- get toggler() {
117
- return require('./libx/_runtime/common/toggles/handler')(cds)
118
- }
87
+ }
119
88
  }
120
89
 
121
90
 
@@ -130,16 +99,6 @@ const _app_serve = function (endpoint) { return {
130
99
  }}
131
100
 
132
101
 
133
- // register graphql router on served event
134
- function serve_graphql (app) {
135
- cds.on('served', services => {
136
- const GraphQLAdapter = require('./libx/gql/GraphQLAdapter')
137
- app.use(new GraphQLAdapter(services, { graphiql: true }))
138
- cds.log()("serving GraphQL endpoint for all services { at: '/graphql' }")
139
- })
140
- }
141
-
142
-
143
102
  function cors (req, res, next) {
144
103
  const { origin } = req.headers
145
104
  if (origin) res.set('access-control-allow-origin', origin)
@@ -0,0 +1,56 @@
1
+ using { cds.xt.Extensions } from './extensions';
2
+ using { cds.xt.TAR } from './model-provider';
3
+
4
+ @protocol: 'rest'
5
+ @(requires : 'authenticated-user')
6
+ service cds.xt.ExtensibilityService @(path:'/-/cds/extensibility') {
7
+ // TODO: allow-lists - custom before('add') handler
8
+ // TODO: async jobs
9
+
10
+ type ActivationLevel : Extensions:activated;
11
+ type CSN: String; // REVISIT: should reuse cds.xt.CSN
12
+ type CSN_OR_CDL: String;
13
+
14
+ // UIFLEX API
15
+ @(requires : ['cds.UIFlexDeveloper', 'cds.ExtensionDeveloper'])
16
+ action addExtension(extensions : array of CSN); // REVISIT: change to array of CSN extensions
17
+
18
+ // Experimantal API
19
+ @(requires : ['cds.ExtensionDeveloper', 'internal-user'])
20
+ action add(
21
+ extension : CSN_OR_CDL,
22
+ tag : Extensions:tag, // optional
23
+ activate : ActivationLevel, // optional, default = 'database'
24
+ tenant : String // optional, for internal-user only
25
+ );
26
+
27
+ // Experimantal API
28
+ @(requires : ['cds.ExtensionDeveloper', 'internal-user'])
29
+ action promote(
30
+ tag : Extensions:tag, // optional
31
+ activate : ActivationLevel, // optional, default = 'database'
32
+ tenant : String // optional, for internal-user only
33
+ );
34
+
35
+ // REVISIT: consider implementing delete
36
+ // action delete(tenant: String, tag: Extensions:tag);
37
+
38
+ // EXTENSION PROJECT
39
+ // deprecated - mimics current cds extend returning TAR (w/o features)
40
+ // only features configured for tenant
41
+ @(requires : ['cds.ExtensionDeveloper'])
42
+ function base() returns TAR;
43
+
44
+ @(requires : ['cds.ExtensionDeveloper'])
45
+ action push (
46
+ extension : TAR // TODO: i18n, csv
47
+ // tag : Extensions:tag,
48
+ // activate : ActivationLevel
49
+ );
50
+
51
+ // REVISIT: separate action for transport -> later
52
+
53
+ event tenantUpdated {
54
+ tenant: String;
55
+ }
56
+ }
@@ -0,0 +1 @@
1
+ module.exports = require('../libx/_runtime/extensibility/service')
@@ -0,0 +1,8 @@
1
+ entity cds.xt.Extensions {
2
+ key ID : UUID;
3
+ tag : String; //> e.g.: uiflex, custom, ...
4
+ csn : String;
5
+ sources : LargeBinary; // TAR
6
+ activated : String enum { propertyBag; database };
7
+ timestamp : Timestamp @cds.on.insert:$now @cds.on.update:$now; // to support invalidation of models
8
+ }
@@ -0,0 +1,59 @@
1
+ context cds.xt { // IMPORTANT: we don't use namespaces to avoid issues with cds.db default namespace
2
+
3
+ @open type CSN {};
4
+ type TAR : LargeBinary;
5
+ type XML : LargeString;
6
+ type Locale : String;
7
+ type TenantID : String;
8
+ type CSNConsumer : String enum { nodejs; java; };
9
+
10
+
11
+ /**
12
+ * Used by CAP runtimes to retrieve tenant-specific variants of
13
+ * deployed models used to serve requests.
14
+ */
15
+ @protocol: 'rest'
16
+ @requires: [ 'internal-user' ] //> we check that ourselves programmatically in production only
17
+ service ModelProviderService @(path:'/-/cds/model-provider', impl:'@sap/cds/srv/model-provider.js') {
18
+
19
+ action getCsn(
20
+ tenant : TenantID,
21
+ toggles : array of String,
22
+ for : CSNConsumer @cds.java.name: 'runtime',
23
+ ) returns CSN;
24
+
25
+ action getExtCsn(
26
+ tenant : TenantID,
27
+ toggles : array of String,
28
+ for : CSNConsumer @cds.java.name: 'runtime',
29
+ ) returns CSN;
30
+
31
+ action getEdmx(
32
+ tenant : TenantID,
33
+ toggles : array of String,
34
+ service : String,
35
+ locale : Locale,
36
+ flavor : String,
37
+ for : CSNConsumer @cds.java.name: 'runtime',
38
+ ) returns XML;
39
+
40
+ action isExtended(
41
+ tenant : TenantID,
42
+ ) returns Boolean;
43
+
44
+ action getExtensions(
45
+ tenant : TenantID,
46
+ ) returns CSN;
47
+
48
+ action getResources () returns TAR;
49
+ action getExtResources() returns TAR;
50
+
51
+ // -------------------------------
52
+ // Later, possibly:
53
+ // function GET csn(...)
54
+ // function GET edmx(...)
55
+ // function GET extended(...)
56
+ // function GET resources(...)
57
+ }
58
+
59
+ }
@@ -0,0 +1,163 @@
1
+ /* eslint-disable no-console */
2
+ const fs = require('fs')
3
+ const path = require('path')
4
+
5
+ const cds = require('../libx/_runtime/cds')
6
+ const DEBUG = cds.debug('mtx')
7
+
8
+ const { packTarArchive, unpackTarArchive } = require('../lib/utils/resources')
9
+ const { collectFiles } = require('../libx/_runtime/extensibility/utils')
10
+
11
+
12
+ const TEMP_DIR = fs.realpathSync(require('os').tmpdir())
13
+
14
+ module.exports = class ModelProviderService extends cds.Service {
15
+
16
+ get _add_stub_methods(){ return true }
17
+ init() {
18
+
19
+ // REVISIT: We should do the enforcement only in production
20
+ // let requires = this.definition['@requires_']
21
+ // if (requires && process.env.NODE_ENV === 'production') this.before ('*', req => {
22
+ // if (!cds.context?.http) return //> not called from external
23
+ // if (req.user._is_anonymous) return req.reject({ code:401 })
24
+ // if (!requires.some(r => req.user.is(r))) return req.reject({ code:403 })
25
+ // })
26
+
27
+ this.on('getCsn', req => _getCsn(req, false, this._nodejs_models))
28
+ this.on('getExtCsn', req => _getExtCsn(req, this._nodejs_models))
29
+ this.on('getEdmx', async req => {
30
+ const { service, locale, flavor } = req.data
31
+ const csn = await _getCsn(req, false, this._nodejs_models)
32
+ const edmx = cds.compile.to.edmx(csn, { service, flavor })
33
+ const {res} = req._; if (res) res.set('Content-Type', 'application/xml')
34
+ return cds.localize(csn, locale, edmx)
35
+ })
36
+
37
+ this.on('getResources', async req => {
38
+ if (req._.res) req._.res.set('content-type', 'application/octet-stream; charset=binary')
39
+ // REVISIT: Works only w/o encoding parameter. Default encoding is 'utf8'.
40
+ // try { return await cds.utils.read('resources.tgz') }
41
+ // root is defined in cds.requires, in case of the sidecar scenario it is set to "_main"
42
+ try { return await require('fs').promises.readFile(require('path').resolve(cds.root, conf?.root || '', 'resources.tgz')) }
43
+ catch(e) { if (e.code !== 'ENOENT') throw e }
44
+ const files = Object.keys(await cds.deploy.resources(['*', cds.env.features.folders]))
45
+ if (!files.length) return req.reject(404)
46
+ if (req._.res) req._.res.set('content-type', 'application/octet-stream; charset=binary')
47
+ return packTarArchive(files, cds.root)
48
+ })
49
+
50
+ this.on('getExtResources', async req => {
51
+ if (!cds.requires.extensibility) return req.reject(400, 'Missing extensibility parameter')
52
+ const rs = await run4 (req.data.tenant, SELECT('sources').from('cds.xt.Extensions'))
53
+ if (!rs.length) return req.reject(404, 'Missing extensions')
54
+ if (rs.every(row => row.sources === null)) return req.reject(404, 'Extension resources not found')
55
+ if (req._.res) req._.res.set('content-type', 'application/octet-stream; charset=binary')
56
+ const temp = await fs.promises.mkdtemp(`${TEMP_DIR}${path.sep}tar-`)
57
+ try {
58
+ await Promise.all (rs.map (row => unpackTarArchive(Buffer.from(JSON.parse(row.sources)), temp, false)))
59
+ return await packTarArchive(collectFiles(temp, ['.csv', '.properties']), temp)
60
+ } finally {
61
+ await (fs.promises.rm || fs.promises.rmdir)(temp, { recursive: true, force: true }).catch(()=>{})
62
+ }
63
+ })
64
+
65
+ this.on('isExtended', async req => _isExtended(req.data.tenant))
66
+
67
+ this.on('getExtensions', async req => {
68
+ if (!cds.requires.extensibility) return req.reject(400, 'Missing extensibility parameter')
69
+ const exts = await run4 (req.data.tenant, SELECT('csn').from('cds.xt.Extensions'))
70
+ if (!exts.length) return req.reject(404, 'Missing extensions')
71
+
72
+ const csn = { extensions: [], definitions: {} }
73
+ exts.forEach(ext => {
74
+ const extCsn = JSON.parse(ext.csn)
75
+ csn.extensions.push(...extCsn.extensions)
76
+ if (extCsn.definitions) csn.definitions = Object.assign(extCsn.definitions, csn.definitions)
77
+ })
78
+
79
+ return csn
80
+ })
81
+
82
+ this.invalidateCache = tenant => {
83
+ for (const key in this._nodejs_models) {
84
+ if (key.startsWith( `${tenant}:`)) {
85
+ delete this._nodejs_models[key]
86
+ }
87
+ }
88
+ }
89
+
90
+ // Conf vars required by getCsn ------------------------------------------
91
+ // eslint-disable-next-line one-var
92
+ const conf = cds.env.requires['cds.xt.ModelProviderService'] || cds.env.requires.kinds['cds.xt.ModelProviderService']
93
+ DEBUG && DEBUG ('ModelProviderService options:', conf)
94
+ const options = {}
95
+ if (conf.root) {
96
+ options.root = path.resolve (cds.root, conf.root)
97
+ options.env = cds.env.for('cds', options.root)
98
+ options.cache = {}
99
+ }
100
+ const fts = cds.env.features.folders
101
+ if (conf.kind !== 'in-sidecar') this._nodejs_models = {}
102
+
103
+ /** The implementation for getCsn */
104
+ async function _getCsn (req, checkExt, cache) {
105
+ const { toggles, for:javaornode } = req.data
106
+ const features = !toggles ? [] : toggles === '*' || toggles.includes('*') ? [fts] : toggles.map (f => fts.replace('*',f))
107
+ const isExtended = await _isExtended(req.data.tenant)
108
+ if (checkExt && !isExtended) req.reject(404, 'Missing extensions')
109
+ const hash = `${isExtended ? req.data.tenant : undefined}:${features.join(',')}`
110
+ if (javaornode && cache && cache[hash]) return cache[hash]
111
+
112
+ const models = cds.resolve(['*',...features], options)
113
+ if (!models) return
114
+
115
+ DEBUG && DEBUG ('loading models from', models)
116
+ let csn = await cds.load(models).then(cds.minify)
117
+ if (isExtended) csn = await _addExtensions(csn, req.data.tenant)
118
+ if (javaornode) csn = cds.compile.for[javaornode](csn)
119
+
120
+ // Dirty hack for cds.localize in Node sidecar setup
121
+ Object.defineProperty(csn,'$sources',{ value:csn.$sources, enumerable:true })
122
+
123
+ if (javaornode && cache) cache[hash] = csn
124
+
125
+ return csn
126
+ }
127
+
128
+ async function _getExtCsn (req, cache) {
129
+ if (!cds.requires.extensibility) return req.reject(400, 'Missing extensibility parameter')
130
+ return _getCsn (req, true, cache)
131
+ }
132
+ }
133
+ }
134
+
135
+
136
+ const run4 = (t,q) => t ? cds.tx({tenant:t}, tx => tx.run(q)) : q
137
+
138
+ /** Add extensions if applicable and exist */
139
+ const _addExtensions = async (csn, tenant) => {
140
+ const exts = await run4 (tenant, SELECT('csn').from('cds.xt.Extensions'))
141
+ if (!exts.length) return csn
142
+
143
+ const all = { definitions: {}, extensions: [] }
144
+ for (const each of exts) {
145
+ const ext = JSON.parse(each.csn)
146
+ if (ext.definitions) Object.assign(all.definitions, ext.definitions)
147
+ if (ext.extensions) all.extensions.push(...ext.extensions)
148
+ }
149
+ const extended = cds.compile({
150
+ 'base.csn': cds.compile.to.json(csn),
151
+ 'ext.csn': cds.compile.to.json(all)
152
+ })
153
+ extended.$sources = csn.$sources // required to load resources like i18n later on
154
+
155
+ return extended
156
+ }
157
+
158
+ async function _isExtended (tenant) {
159
+ if (!cds.requires.extensibility) return false
160
+ if (!tenant && cds.requires.multitenancy) return false
161
+ const one = await run4 (tenant, SELECT.one(1).from('cds.xt.Extensions'))
162
+ return !!one
163
+ }
package/srv/mtx.cds ADDED
@@ -0,0 +1,2 @@
1
+ /** Dummy service for bootstrapping MTX services */
2
+ @protocol:'none' service cds.xt.MTXServices {}
package/srv/mtx.js ADDED
@@ -0,0 +1,22 @@
1
+ const cds = require ('../lib')
2
+ class MTXServices extends cds.Service { async init(){
3
+ if (cds.mtx) return cds.mtx?.in (cds.app) // old mtx
4
+ // else...
5
+ let sources = []
6
+ if (cds.requires.multitenancy) {
7
+ if (!('cds.xt.DeploymentService' in cds.requires)) {
8
+ sources.push('@sap/cds-mtxs/srv/deployment-service')
9
+ if (!('cds.xt.SaasProvisioningService' in cds.requires)) sources.push('@sap/cds-mtxs/srv/cf/saas-provisioning-service')
10
+ }
11
+ }
12
+ if (cds.requires.extensibility) {
13
+ if (!('cds.xt.ExtensibilityService' in cds.requires)) sources.push('@sap/cds/srv/extensibility-service')
14
+ }
15
+ if (cds.requires.toggles) {
16
+ if (!('cds.xt.ModelProviderService' in cds.requires)) sources.push('@sap/cds/srv/model-provider')
17
+ }
18
+ let models = cds.resolve(sources); if (!models) return
19
+ let base = cds.model.$sources; models = models.filter(m => !base.includes(m))
20
+ if (models.length) return cds.serve(models).in(cds.app)
21
+ }}
22
+ module.exports = MTXServices
package/srv/outbox.cds CHANGED
@@ -8,4 +8,6 @@ entity Messages : cuid {
8
8
  msg: LargeString;
9
9
  attempts: Integer default 0;
10
10
  partition: Integer default 0;
11
+ lastError: LargeString;
12
+ lastAttemptTimestamp: Timestamp @cds.on.update : $now;
11
13
  }
@@ -26,18 +26,25 @@ const oa2 = {
26
26
  const main = async () => {
27
27
  // use authorizedRequest to fire against deploy endpoint
28
28
  // (use credentials of XSUAA)
29
- const { body } = await authorizedRequest({
30
- method: 'POST',
31
- uri: optionsApp.appURL,
32
- path: '/messaging/enterprise-messaging/deploy',
33
- dataObj: { tenants: ['all'] },
34
- oa2,
35
- attemptInfo: () => LOG._info && LOG.info('Deploy all tenants'),
36
- errMsg: 'Deployment failed',
37
- target: { kind: 'DEPLOYMENT' },
38
- tokenStore
39
- })
40
- LOG._info && LOG.info('Deployment complete:', body)
29
+ LOG._info && LOG.info('Deploy all tenants')
30
+ try {
31
+ const { body } = await authorizedRequest({
32
+ method: 'POST',
33
+ uri: optionsApp.appURL,
34
+ path: '/messaging/enterprise-messaging/deploy',
35
+ dataObj: { tenants: ['all'] },
36
+ oa2,
37
+ tokenStore
38
+ })
39
+ LOG._info && LOG.info('Deployment complete:', body)
40
+ } catch (e) {
41
+ const error = new Error(`Deployment failed`)
42
+ error.code = 'DEPLOY_FAILED'
43
+ error.target = { kind: 'DEPLOYMENT' }
44
+ error.reason = e
45
+ this.LOG.error(error)
46
+ throw error
47
+ }
41
48
  }
42
49
 
43
50
  main()
@@ -1,36 +0,0 @@
1
-
2
- // Compatibility with srv.emit() used for sync events...
3
-
4
- const sync_events = {
5
- CREATE: 1,
6
- READ: 1,
7
- UPDATE: 1,
8
- DELETE: 1,
9
- INSERT: 1,
10
- GET: 1,
11
- PUT: 1,
12
- POST: 1,
13
- PATCH: 1,
14
- BEGIN: 1,
15
- COMMIT: 1,
16
- ROLLBACK: 1,
17
- }
18
-
19
- const sync_emit = (srv, req) => {
20
- // eslint-disable-next-line no-console
21
- console.trace(`\n
22
- [Deprecated] - srv.emit() used to send synchronous '${req.event}' request.
23
- Please change this to use srv.send() instead.
24
- `)
25
- return srv.dispatch(req)
26
- }
27
-
28
- const {cds} = global
29
- module.exports = function (event, data, headers) {
30
- if (event instanceof cds.Request)
31
- return sync_emit (this, event)
32
- if (event in sync_events)
33
- return sync_emit (this, new cds.Request({ event, data, headers }))
34
- if ((typeof event === 'object' && event.query) || (event.event || event.method) in sync_events)
35
- return sync_emit (this, new cds.Request(event))
36
- }
@@ -1,4 +0,0 @@
1
- module.exports = {
2
- ASPECTS: { CREATE: '_auditCreate', READ: '_auditRead', UPDATE: '_auditUpdate', DELETE: '_auditDelete' },
3
- WRITE: { CREATE: 1, UPDATE: 1, DELETE: 1 }
4
- }
@@ -1,45 +0,0 @@
1
- const cds = require('../../cds')
2
- const LOG = cds.log()
3
-
4
- function decode(req, header, encoded) {
5
- if (!req.headers[header]) return
6
- if (encoded) return JSON.parse(Buffer.from(req.headers[header], 'base64').toString('utf-8'))
7
- return req.headers[header]
8
- }
9
-
10
- class DwcStrategy {
11
- constructor() {
12
- this.name = 'dwc'
13
- }
14
-
15
- authenticate(req) {
16
- let tenant, usr, scopes, attr
17
-
18
- try {
19
- tenant = decode(req, 'dwc-tenant')
20
- usr = decode(req, 'dwc-user', true)
21
- scopes = decode(req, 'dwc-scopes') || ''
22
- attr = decode(req, 'dwc-xsuaa-attributes', true) || {}
23
- } catch (e) {
24
- LOG._debug && LOG.debug('Error while parsing HTTP headers for DWC authentication:', e)
25
- return this.fail()
26
- }
27
-
28
- if (!tenant || !usr) return this.fail()
29
-
30
- // make scopes app-local
31
- const xsappname = decode(req, 'dwc-xsuaa-xsappname') || ''
32
- scopes = scopes.split(' ').map(s => (s.startsWith(xsappname + '.') ? s.replace(xsappname + '.', '') : s))
33
-
34
- const user = new cds.User({
35
- id: usr.logonName,
36
- tenant,
37
- _roles: ['any', 'authenticated-user', ...scopes],
38
- attr: Object.assign(attr, usr)
39
- })
40
-
41
- this.success(user)
42
- }
43
- }
44
-
45
- module.exports = DwcStrategy
@@ -1,56 +0,0 @@
1
- const cds = require('../../../../cds')
2
- const OData = require('../OData')
3
- const DEBUG = cds.debug('extensibility')
4
-
5
- const { alias2ref } = require('../../../../common/utils/csn')
6
- const { BASE_TENANT } = require('../../../../common/utils/extensibilityUtils')
7
-
8
- const SYSTEM_SERVICES = ['cds_r.ExtensibilityService', 'cds_r.ModelProviderService']
9
-
10
- function createOdataService(service) {
11
- const name = (service.definition && service.definition.name) || service.name
12
- const edm = cds.compile.to.edm(service.model, { service: name })
13
- alias2ref(service, edm)
14
-
15
- const odataService = new OData(edm, service.model, service.options)
16
- odataService.addCDSServiceToChannel(service)
17
-
18
- return odataService
19
- }
20
-
21
- async function createNewService(name, model, options) {
22
- const { constructor: Service, path } = cds.services[name]
23
- const service = new Service(name, model, { ...options }) // cloning options to be safe
24
- if (service.init) await service.prepend(service.init)
25
- if (options.impl) await service.prepend(options.impl)
26
- if (path) service.path = path
27
- DEBUG &&
28
- DEBUG('Created tenant-specific service:', service.name, '= new', Service.name, {
29
- _handlers: {
30
- on: service._handlers.on.map(h => ({ on: h.on, handler: () => {} }))
31
- }
32
- })
33
- return createOdataService(service)
34
- }
35
-
36
- const getModelHash = (tenant, features) => {
37
- if (!features) features = []
38
-
39
- let hash
40
- if (cds.requires.multitenancy && tenant) {
41
- hash = tenant
42
- } else {
43
- hash = BASE_TENANT
44
- }
45
-
46
- hash += ':' + features.join(';')
47
-
48
- return hash
49
- }
50
-
51
- module.exports = {
52
- SYSTEM_SERVICES,
53
- createOdataService,
54
- createNewService,
55
- getModelHash
56
- }