@sap/cds 5.9.7 → 6.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (381) hide show
  1. package/CHANGELOG.md +267 -20
  2. package/apis/services.d.ts +1 -1
  3. package/app/fiori/preview.js +2 -6
  4. package/app/index.js +3 -3
  5. package/bin/build/buildTaskEngine.js +17 -15
  6. package/bin/build/buildTaskFactory.js +29 -19
  7. package/bin/build/buildTaskHandler.js +27 -11
  8. package/bin/build/buildTaskProvider.js +2 -4
  9. package/bin/build/buildTaskProviderFactory.js +11 -16
  10. package/bin/build/constants.js +14 -6
  11. package/bin/build/csv-reader.js +2 -1
  12. package/bin/build/index.js +12 -18
  13. package/bin/build/provider/buildTaskHandlerEdmx.js +3 -39
  14. package/bin/build/provider/buildTaskHandlerFeatureToggles.js +149 -0
  15. package/bin/build/provider/buildTaskHandlerInternal.js +2 -3
  16. package/bin/build/provider/buildTaskProviderInternal.js +108 -239
  17. package/bin/build/provider/fiori/index.js +2 -2
  18. package/bin/build/provider/hana/2migration.js +11 -11
  19. package/bin/build/provider/hana/2tabledata.js +3 -3
  20. package/bin/build/provider/hana/index.js +89 -99
  21. package/bin/build/provider/hana/migrationtable.js +4 -3
  22. package/bin/build/provider/java/index.js +101 -0
  23. package/bin/build/provider/java-cf/index.js +1 -101
  24. package/bin/build/provider/mtx/index.js +90 -53
  25. package/bin/build/provider/mtx/resourcesTarBuilder.js +68 -0
  26. package/bin/build/provider/mtx-sidecar/index.js +110 -0
  27. package/bin/build/provider/node-cf/index.js +1 -308
  28. package/bin/build/provider/nodejs/index.js +189 -0
  29. package/bin/build/util.js +19 -31
  30. package/bin/cds.js +5 -3
  31. package/bin/deploy/to-hana/cfUtil.js +31 -6
  32. package/bin/deploy/to-hana/gitUtil.js +5 -3
  33. package/bin/deploy/to-hana/hana.js +9 -10
  34. package/bin/{build → deploy/to-hana}/mtaUtil.js +10 -9
  35. package/bin/mtx/in-cds.js +19 -7
  36. package/bin/serve.js +56 -21
  37. package/bin/utils/log.js +13 -30
  38. package/bin/version.js +5 -4
  39. package/common.cds +61 -16
  40. package/lib/compile/cdsc.js +3 -2
  41. package/lib/compile/etc/_localized.js +15 -14
  42. package/lib/compile/for/drafts.js +3 -4
  43. package/lib/compile/for/java.js +13 -10
  44. package/lib/compile/for/nodejs.js +8 -8
  45. package/lib/compile/for/odata.js +7 -12
  46. package/lib/compile/for/sql.js +5 -6
  47. package/lib/compile/index.js +5 -4
  48. package/lib/compile/load.js +9 -11
  49. package/lib/compile/minify.js +8 -5
  50. package/lib/compile/parse.js +4 -2
  51. package/lib/compile/resolve.js +18 -15
  52. package/lib/compile/to/edm.js +0 -1
  53. package/lib/compile/to/gql.js +3 -2
  54. package/lib/compile/to/json.js +24 -17
  55. package/lib/connect/bindings.js +3 -2
  56. package/lib/connect/index.js +5 -5
  57. package/lib/core/classes.js +74 -2
  58. package/lib/core/entities.js +52 -3
  59. package/lib/core/reflect.js +2 -1
  60. package/lib/deploy.js +11 -8
  61. package/lib/env/defaults.js +4 -3
  62. package/lib/env/index.js +71 -31
  63. package/lib/env/presets.js +1 -14
  64. package/lib/env/requires.js +71 -20
  65. package/lib/env/serviceBindings.js +147 -0
  66. package/lib/i18n/localize.js +22 -23
  67. package/lib/index.js +148 -144
  68. package/lib/log/errors.js +55 -12
  69. package/lib/log/format/kibana.js +1 -1
  70. package/lib/log/index.js +4 -0
  71. package/lib/ql/SELECT.js +7 -2
  72. package/lib/ql/Whereable.js +8 -2
  73. package/lib/ql/index.js +2 -2
  74. package/lib/req/assert.js +71 -0
  75. package/lib/req/cds-context.js +38 -70
  76. package/lib/req/context.js +34 -21
  77. package/lib/req/request.js +12 -18
  78. package/lib/req/response.js +6 -2
  79. package/lib/req/user.js +30 -22
  80. package/lib/serve/Service-api.js +17 -12
  81. package/lib/serve/Service-dispatch.js +5 -9
  82. package/lib/serve/Service-methods.js +4 -3
  83. package/lib/serve/Transaction.js +24 -21
  84. package/lib/serve/adapters.js +15 -5
  85. package/lib/serve/factory.js +23 -20
  86. package/lib/serve/index.js +51 -54
  87. package/lib/utils/axios.js +8 -12
  88. package/lib/utils/index.js +3 -3
  89. package/lib/utils/resources/index.js +1 -44
  90. package/lib/utils/resources/tar.js +2 -1
  91. package/lib/utils/tests.js +13 -15
  92. package/libx/_runtime/.eslintrc +1 -1
  93. package/libx/_runtime/audit/Service.js +6 -4
  94. package/libx/_runtime/audit/generic/personal/access.js +19 -43
  95. package/libx/_runtime/audit/generic/personal/index.js +40 -34
  96. package/libx/_runtime/audit/generic/personal/modification.js +11 -9
  97. package/libx/_runtime/audit/generic/personal/utils.js +13 -6
  98. package/libx/_runtime/audit/utils/v2.js +6 -3
  99. package/libx/_runtime/auth/index.js +71 -66
  100. package/libx/_runtime/auth/strategies/JWT.js +3 -2
  101. package/libx/_runtime/auth/strategies/mock.js +54 -53
  102. package/libx/_runtime/auth/strategies/xssecUtils.js +3 -4
  103. package/libx/_runtime/auth/strategies/xsuaa.js +3 -2
  104. package/libx/_runtime/auth/utils.js +2 -15
  105. package/libx/_runtime/cds-services/adapter/odata-v4/Dispatcher.js +128 -42
  106. package/libx/_runtime/cds-services/adapter/odata-v4/OData.js +6 -3
  107. package/libx/_runtime/cds-services/adapter/odata-v4/ODataRequest.js +93 -73
  108. package/libx/_runtime/cds-services/adapter/odata-v4/handlers/action.js +10 -45
  109. package/libx/_runtime/cds-services/adapter/odata-v4/handlers/create.js +5 -9
  110. package/libx/_runtime/cds-services/adapter/odata-v4/handlers/error.js +9 -5
  111. package/libx/_runtime/cds-services/adapter/odata-v4/handlers/metadata.js +4 -2
  112. package/libx/_runtime/cds-services/adapter/odata-v4/handlers/read.js +60 -53
  113. package/libx/_runtime/cds-services/adapter/odata-v4/handlers/request.js +1 -1
  114. package/libx/_runtime/cds-services/adapter/odata-v4/handlers/update.js +15 -21
  115. package/libx/_runtime/cds-services/adapter/odata-v4/odata-to-cqn/ExpressionToCQN.js +8 -15
  116. package/libx/_runtime/cds-services/adapter/odata-v4/odata-to-cqn/expandToCQN.js +29 -41
  117. package/libx/_runtime/cds-services/adapter/odata-v4/odata-to-cqn/index.js +1 -4
  118. package/libx/_runtime/cds-services/adapter/odata-v4/odata-to-cqn/readToCQN.js +13 -13
  119. package/libx/_runtime/cds-services/adapter/odata-v4/odata-to-cqn/selectToCQN.js +0 -7
  120. package/libx/_runtime/cds-services/adapter/odata-v4/odata-to-cqn/utils.js +24 -1
  121. package/libx/_runtime/cds-services/adapter/odata-v4/okra/odata-commons/edm/EdmEntityContainer.js +1 -1
  122. package/libx/_runtime/cds-services/adapter/odata-v4/okra/odata-commons/uri/UriHelper.js +4 -3
  123. package/libx/_runtime/cds-services/adapter/odata-v4/okra/odata-commons/utils/PrimitiveValueDecoder.js +4 -5
  124. package/libx/_runtime/cds-services/adapter/odata-v4/okra/odata-commons/utils/ValueConverter.js +4 -3
  125. package/libx/_runtime/cds-services/adapter/odata-v4/okra/odata-commons/validator/ValueValidator.js +5 -3
  126. package/libx/_runtime/cds-services/adapter/odata-v4/okra/odata-server/core/ResponseHeaderSetter.js +2 -0
  127. package/libx/_runtime/cds-services/adapter/odata-v4/okra/odata-server/invocation/DebugSerializingCommand.js +1 -1
  128. package/libx/_runtime/cds-services/adapter/odata-v4/okra/odata-server/invocation/PresetResponseHeadersCommand.js +1 -1
  129. package/libx/_runtime/cds-services/adapter/odata-v4/okra/odata-server/invocation/SerializingCommand.js +1 -1
  130. package/libx/_runtime/cds-services/adapter/odata-v4/okra/odata-server/invocation/SetResponseHeadersCommand.js +1 -1
  131. package/libx/_runtime/cds-services/adapter/odata-v4/okra/odata-server/serializer/ContextURLFactory.js +3 -2
  132. package/libx/_runtime/cds-services/adapter/odata-v4/okra/odata-server/serializer/ErrorJsonSerializer.js +3 -1
  133. package/libx/_runtime/cds-services/adapter/odata-v4/okra/odata-server/serializer/SerializerFactory.js +1 -0
  134. package/libx/_runtime/cds-services/adapter/odata-v4/okra/odata-server/serializer/TrustedResourceJsonSerializer.js +3 -3
  135. package/libx/_runtime/cds-services/adapter/odata-v4/utils/data.js +36 -25
  136. package/libx/_runtime/cds-services/adapter/odata-v4/utils/handlerUtils.js +100 -91
  137. package/libx/_runtime/cds-services/adapter/odata-v4/utils/metaInfo.js +382 -0
  138. package/libx/_runtime/cds-services/adapter/odata-v4/utils/oDataConfiguration.js +1 -4
  139. package/libx/_runtime/cds-services/adapter/odata-v4/utils/omitValues.js +5 -6
  140. package/libx/_runtime/cds-services/adapter/odata-v4/utils/readAfterWrite.js +77 -21
  141. package/libx/_runtime/cds-services/adapter/odata-v4/utils/request.js +3 -11
  142. package/libx/_runtime/cds-services/adapter/odata-v4/utils/result.js +91 -69
  143. package/libx/_runtime/cds-services/adapter/odata-v4/utils/stream.js +27 -6
  144. package/libx/_runtime/cds-services/adapter/rest/utils/validation-checks.js +7 -17
  145. package/libx/_runtime/cds-services/services/Service.js +17 -76
  146. package/libx/_runtime/cds-services/services/utils/columns.js +6 -4
  147. package/libx/_runtime/cds-services/services/utils/compareJson.js +1 -53
  148. package/libx/_runtime/cds-services/services/utils/differ.js +15 -19
  149. package/libx/_runtime/cds-services/util/assert.js +107 -34
  150. package/libx/_runtime/cds.js +1 -31
  151. package/libx/_runtime/common/aspects/Association.js +40 -54
  152. package/libx/_runtime/common/aspects/any.js +61 -6
  153. package/libx/_runtime/common/aspects/entity.js +19 -79
  154. package/libx/_runtime/common/composition/data.js +2 -2
  155. package/libx/_runtime/common/composition/delete.js +8 -7
  156. package/libx/_runtime/common/composition/tree.js +10 -10
  157. package/libx/_runtime/common/composition/update.js +3 -2
  158. package/libx/_runtime/common/constants/events.js +15 -0
  159. package/libx/_runtime/common/error/entry.js +9 -3
  160. package/libx/_runtime/common/error/frontend.js +13 -19
  161. package/libx/_runtime/common/error/index.js +8 -3
  162. package/libx/_runtime/common/generic/auth/capabilities.js +2 -1
  163. package/libx/_runtime/common/generic/auth/constants.js +1 -4
  164. package/libx/_runtime/common/generic/auth/requires.js +1 -1
  165. package/libx/_runtime/common/generic/auth/restrict.js +12 -28
  166. package/libx/_runtime/common/generic/auth/restrictions.js +12 -4
  167. package/libx/_runtime/common/generic/auth/utils.js +2 -1
  168. package/libx/_runtime/common/generic/crud.js +9 -60
  169. package/libx/_runtime/common/generic/etag.js +41 -7
  170. package/libx/_runtime/common/generic/input.js +128 -66
  171. package/libx/_runtime/common/generic/paging.js +9 -3
  172. package/libx/_runtime/common/generic/put.js +2 -2
  173. package/libx/_runtime/common/generic/sorting.js +7 -3
  174. package/libx/_runtime/common/generic/temporal.js +0 -5
  175. package/libx/_runtime/common/i18n/messages.properties +2 -1
  176. package/libx/_runtime/common/utils/binary.js +69 -0
  177. package/libx/_runtime/common/utils/cqn.js +39 -14
  178. package/libx/_runtime/common/utils/cqn2cqn4sql.js +93 -59
  179. package/libx/_runtime/common/utils/csn.js +87 -85
  180. package/libx/_runtime/common/utils/dollar.js +8 -7
  181. package/libx/_runtime/common/utils/draft.js +1 -1
  182. package/libx/_runtime/common/utils/foreignKeyPropagations.js +23 -7
  183. package/libx/_runtime/common/utils/generateOnCond.js +2 -1
  184. package/libx/_runtime/common/utils/keys.js +30 -13
  185. package/libx/_runtime/common/utils/postProcessing.js +6 -1
  186. package/libx/_runtime/common/utils/quotingStyles.js +0 -23
  187. package/libx/_runtime/common/utils/resolveStructured.js +23 -26
  188. package/libx/_runtime/common/utils/resolveView.js +4 -1
  189. package/libx/_runtime/common/utils/rewriteAsterisks.js +3 -0
  190. package/libx/_runtime/common/utils/search2cqn4sql.js +4 -13
  191. package/libx/_runtime/common/utils/searchToLike.js +9 -13
  192. package/libx/_runtime/common/utils/streamProp.js +35 -0
  193. package/libx/_runtime/common/utils/structured.js +12 -18
  194. package/libx/_runtime/common/utils/template.js +3 -5
  195. package/libx/_runtime/common/utils/templateProcessor.js +22 -14
  196. package/libx/_runtime/common/utils/unionCqnTemplate.js +4 -14
  197. package/libx/_runtime/db/Service.js +2 -1
  198. package/libx/_runtime/db/expand/expand-v2.js +2 -2
  199. package/libx/_runtime/db/expand/expandCQNToJoin.js +7 -6
  200. package/libx/_runtime/db/generic/input.js +14 -17
  201. package/libx/_runtime/db/generic/integrity.js +1 -2
  202. package/libx/_runtime/db/generic/update.js +14 -1
  203. package/libx/_runtime/db/query/read.js +0 -1
  204. package/libx/_runtime/db/query/update.js +1 -1
  205. package/libx/_runtime/db/sql-builder/BaseBuilder.js +1 -1
  206. package/libx/_runtime/db/sql-builder/ExpressionBuilder.js +5 -31
  207. package/libx/_runtime/db/sql-builder/InsertBuilder.js +1 -1
  208. package/libx/_runtime/db/sql-builder/ReferenceBuilder.js +0 -9
  209. package/libx/_runtime/db/sql-builder/SelectBuilder.js +11 -10
  210. package/libx/_runtime/db/sql-builder/UpdateBuilder.js +2 -2
  211. package/libx/_runtime/db/sql-builder/annotations.js +1 -2
  212. package/libx/_runtime/db/utils/coloredTxCommands.js +5 -0
  213. package/libx/_runtime/db/utils/columns.js +1 -1
  214. package/libx/_runtime/db/utils/propagateForeignKeys.js +10 -2
  215. package/libx/_runtime/extensibility/activate.js +69 -0
  216. package/libx/_runtime/extensibility/add.js +41 -0
  217. package/libx/_runtime/extensibility/addExtension.js +68 -0
  218. package/libx/_runtime/extensibility/defaults.js +39 -0
  219. package/libx/_runtime/extensibility/{uiflex/handler → handler}/transformREAD.js +0 -0
  220. package/libx/_runtime/extensibility/{uiflex/handler → handler}/transformRESULT.js +2 -2
  221. package/libx/_runtime/extensibility/{uiflex/handler → handler}/transformWRITE.js +2 -2
  222. package/libx/_runtime/extensibility/push.js +61 -0
  223. package/libx/_runtime/extensibility/service.js +21 -0
  224. package/libx/_runtime/extensibility/{uiflex/utils.js → utils.js} +39 -3
  225. package/libx/_runtime/extensibility/validation.js +53 -0
  226. package/libx/_runtime/extensibility/views.js +12 -0
  227. package/libx/_runtime/fiori/generic/activate.js +6 -4
  228. package/libx/_runtime/fiori/generic/before.js +17 -29
  229. package/libx/_runtime/fiori/generic/cancel.js +2 -4
  230. package/libx/_runtime/fiori/generic/delete.js +2 -4
  231. package/libx/_runtime/fiori/generic/edit.js +3 -7
  232. package/libx/_runtime/fiori/generic/index.js +31 -0
  233. package/libx/_runtime/fiori/generic/new.js +2 -4
  234. package/libx/_runtime/fiori/generic/patch.js +4 -8
  235. package/libx/_runtime/fiori/generic/prepare.js +2 -4
  236. package/libx/_runtime/fiori/generic/read.js +137 -162
  237. package/libx/_runtime/fiori/generic/readOverDraft.js +10 -4
  238. package/libx/_runtime/fiori/utils/handler.js +10 -5
  239. package/libx/_runtime/fiori/utils/where.js +1 -4
  240. package/libx/_runtime/hana/Service.js +14 -7
  241. package/libx/_runtime/hana/customBuilder/CustomSelectBuilder.js +1 -1
  242. package/libx/_runtime/hana/dynatrace.js +2 -2
  243. package/libx/_runtime/hana/localized.js +7 -6
  244. package/libx/_runtime/hana/pool.js +9 -6
  245. package/libx/_runtime/hana/search.js +2 -3
  246. package/libx/_runtime/hana/{searchToContains.js → search2Contains.js} +5 -2
  247. package/libx/_runtime/hana/search2cqn4sql.js +20 -17
  248. package/libx/_runtime/index.js +2 -6
  249. package/libx/_runtime/messaging/AMQPWebhookMessaging.js +11 -2
  250. package/libx/_runtime/messaging/common-utils/AMQPClient.js +4 -3
  251. package/libx/_runtime/messaging/common-utils/appId.js +9 -0
  252. package/libx/_runtime/messaging/common-utils/authorizedRequest.js +2 -18
  253. package/libx/_runtime/messaging/common-utils/connections.js +1 -1
  254. package/libx/_runtime/messaging/enterprise-messaging-shared.js +2 -2
  255. package/libx/_runtime/messaging/enterprise-messaging-utils/EMManagement.js +305 -231
  256. package/libx/_runtime/messaging/enterprise-messaging-utils/cloudEvents.js +2 -2
  257. package/libx/_runtime/messaging/enterprise-messaging-utils/options-management.js +15 -8
  258. package/libx/_runtime/messaging/enterprise-messaging-utils/options-messaging.js +57 -14
  259. package/libx/_runtime/messaging/enterprise-messaging.js +14 -19
  260. package/libx/_runtime/messaging/file-based.js +2 -1
  261. package/libx/_runtime/messaging/http-utils/token.js +18 -6
  262. package/libx/_runtime/messaging/message-queuing-utils/options-management.js +22 -12
  263. package/libx/_runtime/messaging/message-queuing-utils/options-messaging.js +27 -14
  264. package/libx/_runtime/messaging/message-queuing.js +138 -85
  265. package/libx/_runtime/messaging/outbox/utils.js +13 -7
  266. package/libx/_runtime/messaging/redis-messaging.js +0 -1
  267. package/libx/_runtime/messaging/service.js +4 -1
  268. package/libx/_runtime/remote/Service.js +24 -18
  269. package/libx/_runtime/remote/utils/client.js +84 -46
  270. package/libx/_runtime/remote/utils/data.js +23 -6
  271. package/libx/_runtime/sqlite/Service.js +14 -13
  272. package/libx/_runtime/sqlite/convertAssocToOneManaged.js +2 -0
  273. package/libx/_runtime/sqlite/customBuilder/CustomSelectBuilder.js +1 -0
  274. package/libx/_runtime/sqlite/execute.js +3 -9
  275. package/libx/_runtime/types/api.js +23 -11
  276. package/libx/common/utils/ucsn.js +15 -9
  277. package/libx/odata/afterburner.js +109 -29
  278. package/libx/odata/cqn2odata.js +48 -9
  279. package/libx/odata/grammar.pegjs +261 -157
  280. package/libx/odata/index.js +21 -9
  281. package/libx/odata/parseToCqn.js +8 -5
  282. package/libx/odata/parser.js +1 -1
  283. package/libx/odata/utils.js +13 -3
  284. package/libx/rest/RestAdapter.js +173 -113
  285. package/libx/rest/RestRequest.js +3 -2
  286. package/libx/rest/middleware/create.js +8 -6
  287. package/libx/rest/middleware/delete.js +6 -13
  288. package/libx/rest/middleware/error.js +1 -1
  289. package/libx/rest/middleware/input.js +6 -6
  290. package/libx/rest/middleware/operation.js +8 -3
  291. package/libx/rest/middleware/parse.js +3 -3
  292. package/libx/rest/middleware/payload.js +12 -0
  293. package/libx/rest/middleware/read.js +12 -2
  294. package/libx/rest/middleware/update.js +3 -3
  295. package/package.json +4 -6
  296. package/server.js +3 -44
  297. package/srv/extensibility-service.cds +56 -0
  298. package/srv/extensibility-service.js +1 -0
  299. package/srv/extensions.cds +8 -0
  300. package/srv/model-provider.cds +59 -0
  301. package/srv/model-provider.js +163 -0
  302. package/srv/mtx.cds +2 -0
  303. package/srv/mtx.js +22 -0
  304. package/srv/outbox.cds +2 -0
  305. package/tasks/enterprise-messaging-deploy.js +19 -12
  306. package/lib/serve/Service-compat.js +0 -36
  307. package/libx/_runtime/audit/generic/personal/constants.js +0 -4
  308. package/libx/_runtime/auth/strategies/dwc.js +0 -45
  309. package/libx/_runtime/cds-services/adapter/odata-v4/utils/dispatcherUtils.js +0 -56
  310. package/libx/_runtime/cds-services/adapter/rest/Rest.js +0 -183
  311. package/libx/_runtime/cds-services/adapter/rest/RestRequest.js +0 -67
  312. package/libx/_runtime/cds-services/adapter/rest/handlers/create.js +0 -82
  313. package/libx/_runtime/cds-services/adapter/rest/handlers/delete.js +0 -39
  314. package/libx/_runtime/cds-services/adapter/rest/handlers/operation.js +0 -63
  315. package/libx/_runtime/cds-services/adapter/rest/handlers/read.js +0 -52
  316. package/libx/_runtime/cds-services/adapter/rest/handlers/update.js +0 -81
  317. package/libx/_runtime/cds-services/adapter/rest/rest-to-cqn/index.js +0 -56
  318. package/libx/_runtime/cds-services/adapter/rest/rest-to-cqn/utils.js +0 -33
  319. package/libx/_runtime/cds-services/adapter/rest/to.js +0 -8
  320. package/libx/_runtime/cds-services/adapter/rest/utils/binary.js +0 -50
  321. package/libx/_runtime/cds-services/adapter/rest/utils/data.js +0 -117
  322. package/libx/_runtime/cds-services/adapter/rest/utils/header-checks.js +0 -14
  323. package/libx/_runtime/cds-services/adapter/rest/utils/key-value-utils.js +0 -30
  324. package/libx/_runtime/cds-services/adapter/rest/utils/parse-url.js +0 -250
  325. package/libx/_runtime/cds-services/adapter/rest/utils/result.js +0 -26
  326. package/libx/_runtime/cds-services/services/utils/handlerUtils.js +0 -200
  327. package/libx/_runtime/common/aspects/utils.js +0 -152
  328. package/libx/_runtime/common/toggles/handler.js +0 -21
  329. package/libx/_runtime/common/utils/extensibilityUtils.js +0 -18
  330. package/libx/_runtime/extensibility/mps/index.js +0 -5
  331. package/libx/_runtime/extensibility/mps/service.js +0 -111
  332. package/libx/_runtime/extensibility/mps/tar.js +0 -42
  333. package/libx/_runtime/extensibility/mps/utils.js +0 -11
  334. package/libx/_runtime/extensibility/uiflex/index.js +0 -54
  335. package/libx/_runtime/extensibility/uiflex/service.js +0 -276
  336. package/libx/_runtime/messaging/common-utils/naming-conventions.js +0 -20
  337. package/libx/_runtime/remote/utils/client-types.d.ts +0 -7
  338. package/libx/gql/GraphQLAdapter.js +0 -33
  339. package/libx/gql/constants/adapter.js +0 -69
  340. package/libx/gql/constants/cds.js +0 -18
  341. package/libx/gql/constants/graphql.js +0 -33
  342. package/libx/gql/readme.md +0 -1
  343. package/libx/gql/resolvers/crud/create.js +0 -20
  344. package/libx/gql/resolvers/crud/delete.js +0 -29
  345. package/libx/gql/resolvers/crud/index.js +0 -6
  346. package/libx/gql/resolvers/crud/read.js +0 -30
  347. package/libx/gql/resolvers/crud/update.js +0 -42
  348. package/libx/gql/resolvers/crud/utils/index.js +0 -36
  349. package/libx/gql/resolvers/field.js +0 -5
  350. package/libx/gql/resolvers/index.js +0 -7
  351. package/libx/gql/resolvers/mutation.js +0 -23
  352. package/libx/gql/resolvers/parse/ast/enrich.js +0 -52
  353. package/libx/gql/resolvers/parse/ast/fragment.js +0 -11
  354. package/libx/gql/resolvers/parse/ast/fromObject.js +0 -39
  355. package/libx/gql/resolvers/parse/ast/index.js +0 -3
  356. package/libx/gql/resolvers/parse/ast/meta.js +0 -4
  357. package/libx/gql/resolvers/parse/ast/variable.js +0 -7
  358. package/libx/gql/resolvers/parse/ast2cqn/columns.js +0 -44
  359. package/libx/gql/resolvers/parse/ast2cqn/entries.js +0 -31
  360. package/libx/gql/resolvers/parse/ast2cqn/index.js +0 -8
  361. package/libx/gql/resolvers/parse/ast2cqn/limit.js +0 -6
  362. package/libx/gql/resolvers/parse/ast2cqn/orderBy.js +0 -24
  363. package/libx/gql/resolvers/parse/ast2cqn/utils/index.js +0 -3
  364. package/libx/gql/resolvers/parse/ast2cqn/where.js +0 -70
  365. package/libx/gql/resolvers/parse/utils/index.js +0 -8
  366. package/libx/gql/resolvers/query.js +0 -13
  367. package/libx/gql/resolvers/root.js +0 -34
  368. package/libx/gql/schema/generate.js +0 -18
  369. package/libx/gql/schema/index.js +0 -5
  370. package/libx/gql/schema/mutation.js +0 -76
  371. package/libx/gql/schema/query.js +0 -108
  372. package/libx/gql/schema/typeDefMap.js +0 -45
  373. package/libx/gql/schema/utils/index.js +0 -54
  374. package/libx/gql/utils/index.js +0 -12
  375. package/libx/rest/middleware/auth.js +0 -20
  376. package/libx/rest/middleware/content.js +0 -19
  377. package/srv/flex.cds +0 -21
  378. package/srv/flex.js +0 -1
  379. package/srv/mps.cds +0 -23
  380. package/srv/mps.js +0 -1
  381. package/srv/outbox.js +0 -0
@@ -1,308 +1 @@
1
- const { fs } = require('@sap/cds-foss')
2
- const path = require('path')
3
- const BuildTaskHandlerEdmx = require('../buildTaskHandlerEdmx')
4
- const { getHanaDbModuleDescriptor, getServiceModuleDescriptor } = require('../../mtaUtil')
5
- const { BuildError } = require('../../util')
6
- const { BUILD_OPTION_OUTPUT_MODE, OUTPUT_MODE_RESULT_ONLY, ODATA_VERSION, ODATA_VERSION_V2,
7
- BUILD_TASK_HANA, FOLDER_GEN, BUILD_NODEJS_EDMX_GENERAION, EDMX_GENERATION,
8
- SKIP_PACKAGE_JSON_GENERATION, SKIP_MANIFEST_GENERATION,
9
- CONTENT_EDMX, CONTENT_MANIFEST, CONTENT_PACKAGE_JSON, CONTENT_PACKAGELOCK_JSON }
10
- = require('../../constants')
11
- const { WARNING } = require('../../buildTaskHandler')
12
-
13
- const FILE_NAME_MANIFEST_YML = "manifest.yml"
14
-
15
- class NodeCfModuleBuilder extends BuildTaskHandlerEdmx {
16
- init() {
17
- super.init()
18
- // set unified option values in order to easy access later on
19
- this.task.options[CONTENT_EDMX] = this.hasBuildOption(CONTENT_EDMX, true) || this.hasCdsEnvOption(BUILD_NODEJS_EDMX_GENERAION, true) || this.hasBuildOption(EDMX_GENERATION, true) ? true : false
20
- this.task.options[CONTENT_MANIFEST] = !this.hasBuildOption(CONTENT_MANIFEST, false) && !this.hasBuildOption(SKIP_MANIFEST_GENERATION, true) ? true : false
21
- this.task.options[CONTENT_PACKAGE_JSON] = !this.hasBuildOption(CONTENT_PACKAGE_JSON, false) && !this.hasBuildOption(SKIP_PACKAGE_JSON_GENERATION, true) ? true : false
22
- this.task.options[CONTENT_PACKAGELOCK_JSON] = !this.hasBuildOption(CONTENT_PACKAGELOCK_JSON, false) ? true : false
23
-
24
- if (this.task.options.compileDest) {
25
- throw new BuildError("Option not supported - compileDest")
26
- }
27
- // fallback if src has been defined as '.'
28
- this.destGen = this.isStagingBuild() ? path.resolve(this.task.dest, path.relative(this.buildOptions.root, this.task.src) || this.env.folders.srv) : path.join(this.task.dest, FOLDER_GEN)
29
- }
30
-
31
- async build() {
32
- if (this.env.get(ODATA_VERSION) === ODATA_VERSION_V2) {
33
- // log warning as nodejs is only supporting odata version V4
34
- this.pushMessage("OData v2 is not supported by node runtime. Make sure to define OData v2 in cds configuration.", WARNING)
35
- }
36
- // by default model contains all features
37
- const model = await this.model()
38
- if (!model) {
39
- return this._result
40
- }
41
-
42
- const { dictionary, sources } = await this._compileAll(model)
43
-
44
- // collect and write language bundles into single i18n.json file
45
- await this._collectAllLanguageBundles(dictionary, sources, this.destGen)
46
-
47
- if (this.hasBuildOption(CONTENT_EDMX, true)) {
48
- await this.compileToEdmx(dictionary.base, this.destGen)
49
- }
50
-
51
- if (!this.hasBuildOption(BUILD_OPTION_OUTPUT_MODE, OUTPUT_MODE_RESULT_ONLY)) {
52
- await this._copyNativeContent(this.task.src, this.isStagingBuild() ? this.destGen : path.dirname(this.destGen))
53
-
54
- if (this.hasBuildOption(CONTENT_MANIFEST, true)) {
55
- await Promise.all([this._writeManifestYml(), this._writeCfIgnore()])
56
- }
57
- }
58
- return this._result
59
- }
60
-
61
- async clean() {
62
- // staging build content is deleted by BuildTaskEngine
63
- if (this.buildOptions.target === this.buildOptions.root) {
64
- // delete the entire 'task.dest' folder otherwise, for details see #constructor
65
- // - the value of the folder 'src' has been appended to the origin 'task.dest' dir
66
- this.logger._debug && this.logger.debug(`Deleting build target folder ${this.destGen}`)
67
- await fs.remove(this.isStagingBuild() ? this.task.dest : this.destGen)
68
- }
69
- }
70
-
71
- async _copyNativeContent(src, dest) {
72
- const regex = RegExp('\\.cds$|package\\.json|package-lock\\.json|manifest\\.y.?ml')
73
-
74
- await super.copyNativeContent(src, dest, (entry) => {
75
- if (fs.statSync(entry).isDirectory()) {
76
- return true // using common filter for folders
77
- }
78
- return !regex.test(path.basename(entry))
79
- })
80
-
81
- // copy relevant content located at project root, e.g. *.js, i18n/*, package.json -> gen/srv
82
- let packageJsonCopy = false
83
- let { folders = ['i18n'] } = this.env.i18n
84
- folders.push('handlers')
85
- folders = folders.map(folder => path.join(this.buildOptions.root, folder))
86
-
87
- await super.copyNativeContent(this.buildOptions.root, this.task.dest, (entry) => {
88
- if (fs.statSync(entry).isDirectory()) {
89
- return folders.some(folder => entry.startsWith(folder))
90
- }
91
- if (/\.js$|\.properties$/.test(entry)) {
92
- return true
93
- }
94
- if (/package\.json$/.test(entry) && this.hasBuildOption(CONTENT_PACKAGE_JSON, true)) {
95
- packageJsonCopy = true
96
- return true
97
- }
98
- if (/package-lock\.json$/.test(entry) && this.hasBuildOption(CONTENT_PACKAGELOCK_JSON, true)) {
99
- return true
100
- }
101
- return false
102
- })
103
-
104
- if (packageJsonCopy) {
105
- await this._modifyPackageJson(path.join(this.task.dest, 'package.json'))
106
- }
107
- }
108
-
109
- /**
110
- * Filter file dependencies for CF deployment.<p>
111
- *
112
- * On CF, any ../file or file:... dependency is not resolvable anyways, so we can safely filter it out.
113
- * In CAP samples, we use these to refer to other CDS modules at build time.
114
- * @param {string} file
115
- */
116
- async _modifyPackageJson(file) {
117
- function _deleteFileDependencies(deps = {}) {
118
- let changed = false
119
- Object.keys(deps).forEach(key => {
120
- if (typeof deps[key] === 'string' && deps[key].startsWith('.') || deps[key].startsWith('file:')) {
121
- this.logger.log(`${this.task.for}: removing file dependency '${deps[key]}' from ${path.relative(this.buildOptions.root, file)}`)
122
- delete deps[key]
123
- changed = true
124
- }
125
- })
126
- return changed
127
- }
128
- function _addEnginesField(content) {
129
- if (!content.engines || !content.engines.node) {
130
- const { engines } = require('../../../../package.json')
131
- if (engines && engines.node) {
132
- this.logger.log(`${this.task.for}: adding node engines version to package.json ${engines.node}`)
133
- content.engines = content.engines || {}
134
- content.engines.node = engines.node
135
- return true
136
- }
137
- }
138
- return false
139
- }
140
-
141
- let content = await fs.readFile(file)
142
- let changed = false
143
- if (content) {
144
- content = JSON.parse(content)
145
- changed |= _deleteFileDependencies.call(this, content.dependencies)
146
- changed |= _deleteFileDependencies.call(this, content.devDependencies)
147
- changed |= _addEnginesField.call(this, content)
148
- }
149
- if (changed) {
150
- await this.write(content).to(file)
151
- }
152
- }
153
-
154
- // this is to have a dev fast-turnaround
155
- async _writeCfIgnore() {
156
- if (this.isStagingBuild()) {
157
- const content = `node_modules/\n`
158
- await this.write(content).to('.cfignore')
159
- }
160
- }
161
-
162
- async _writeManifestYml() {
163
- if (!this.isStagingBuild()) {
164
- return
165
- }
166
-
167
- let manifest = path.join(this.task.src, FILE_NAME_MANIFEST_YML)
168
- if (await fs.pathExists(manifest)) {
169
- // copy existing manifest to service root folder in staging area
170
- await this.copy(manifest).to(FILE_NAME_MANIFEST_YML)
171
- return
172
- }
173
- manifest = path.join(this.task.src, 'manifest.yml')
174
- if (await fs.pathExists(manifest)) {
175
- // copy existing manifest to service root folder in staging area
176
- await this.copy(manifest).to('manifest.yml')
177
- return
178
- }
179
-
180
- // generate one...
181
- // check whether a hdi service binding is required
182
- const hanaBuildTask = this.buildOptions.tasks.find(task => task.for === BUILD_TASK_HANA)
183
- let hanaServiceBinding = ""
184
-
185
- if (hanaBuildTask) {
186
- const dbModuleDescriptor = await getHanaDbModuleDescriptor(this.buildOptions.root, path.basename(hanaBuildTask.src), this.logger)
187
- hanaServiceBinding = ` - ${dbModuleDescriptor.hdiServiceName}`
188
- } else {
189
- this.logger.debug("generating manifest.yml without HANA service binding, using sqlite database")
190
- }
191
-
192
- try {
193
- const srvModuleDescriptor = await getServiceModuleDescriptor(this.buildOptions.root, path.basename(this.task.src), "nodejs", this.logger)
194
- const MANIFEST_YML_CONTENT = `---
195
- applications:
196
- - name: ${srvModuleDescriptor.appName}
197
- path: .
198
- memory: 256M
199
- buildpacks:
200
- - nodejs_buildpack
201
- services:
202
- ${hanaServiceBinding}`
203
-
204
- await this.write(MANIFEST_YML_CONTENT).to(FILE_NAME_MANIFEST_YML)
205
- } catch (e) {
206
- if (e.name === 'YAMLSyntaxError') {
207
- this.logger.error("Failed to parse [mta.yaml]")
208
- }
209
- this.logger.error(e)
210
- }
211
- }
212
-
213
- async _compileAll(csn) {
214
- const sources = await this._resolveSourcePaths(csn)
215
- const dictionary = { base: null, features: null }
216
-
217
- if (sources.features) {
218
- // create base model
219
- dictionary.base = await this.cds.load(sources.base, this.options())
220
- dictionary.features = await this._compileFeatures(dictionary.base, sources.features)
221
- } else {
222
- // model already represents the base model as no feature toggles exist
223
- dictionary.base = csn
224
- }
225
- // adding csn to build result containing @source and _where persisted properties
226
- await this.compileToJson(dictionary.base, this.destGen)
227
-
228
- return { dictionary, sources }
229
- }
230
-
231
- async _collectAllLanguageBundles(dictionary, paths, dest) {
232
- // create language bundle for base model
233
- await this.collectLanguageBundles(dictionary.base, dest)
234
- if (dictionary.features) {
235
- const fts = path.dirname(this.env.features.folders)
236
- // create language bundles for all features
237
- for (const ftName in dictionary.features) {
238
- // attach the sources information for i18n location reference
239
- dictionary.features[ftName]['$sources'] = paths.features[ftName]
240
- await this.collectLanguageBundles(dictionary.features[ftName], path.join(dest, fts, ftName), false)
241
- }
242
- }
243
- }
244
-
245
- async _resolveSourcePaths(csn) {
246
- const fts = this.env.features.folders ? path.dirname(this.env.features.folders) : undefined
247
- const regex = new RegExp(path.resolve(this.buildOptions.root, fts || 'fts').replace(/\\/g, '\\\\') + '[/|\\\\](?<ftName>[^/|\\\\]*)')
248
- let paths = { base: [] }
249
-
250
- // add ROOT source file paths for the base model
251
- paths.base = this._resolveModel().reduce((acc, file) => {
252
- const match = file.match(regex)
253
- if (!match) {
254
- acc.push(file)
255
- }
256
- return acc
257
- }, [])
258
-
259
- // check whether feature toggles are used by this project
260
- if (!fts || !await fs.pathExists(path.join(this.buildOptions.root, fts))) {
261
- return paths
262
- }
263
-
264
- // add source file paths for the features
265
- paths.features = csn['$sources'].reduce((acc, file) => {
266
- const match = file.match(regex)
267
- if (match) {
268
- const { ftName } = match.groups
269
- //feature
270
- if (!acc[ftName]) {
271
- acc[ftName] = []
272
- }
273
- acc[ftName].push(file)
274
- }
275
- return acc
276
- }, {})
277
-
278
- return paths
279
- }
280
-
281
- async _compileFeatures(baseCsn, ftsPaths) {
282
- if (!ftsPaths) {
283
- return
284
- }
285
- const features = {}
286
- const fts = path.dirname(this.env.features.folders)
287
- const options = { ...this.options(), ...{ flavor: 'parsed' } }
288
- // create feature models
289
- for (const ftName in ftsPaths) {
290
- const parsedCsn = await this.cds.load(ftsPaths[ftName], options)
291
- // delete any requires references
292
- if (parsedCsn.requires) {
293
- delete parsedCsn.requires
294
- }
295
- await this.compileToJson(parsedCsn, path.join(this.destGen, fts, ftName), false)
296
- this._validateFeature(baseCsn, parsedCsn)
297
- features[ftName] = parsedCsn
298
- }
299
- return features
300
- }
301
-
302
- _validateFeature(baseCsn, parsedCsn) {
303
- // features must not contain any other dependencies than base model
304
- require('@sap/cds-compiler').compileSources({ 'base.csn': baseCsn, 'parsed.csn': parsedCsn }, this.options())
305
- }
306
- }
307
-
308
- module.exports = NodeCfModuleBuilder
1
+ module.exports = require('../nodejs')
@@ -0,0 +1,189 @@
1
+ const fs = require('fs')
2
+ const path = require('path')
3
+ const BuildTaskHandlerEdmx = require('../buildTaskHandlerEdmx')
4
+ const { BuildError } = require('../../util')
5
+ const { BUILD_OPTION_OUTPUT_MODE, OUTPUT_MODE_RESULT_ONLY, ODATA_VERSION, ODATA_VERSION_V2, FOLDER_GEN, BUILD_NODEJS_EDMX_GENERAION, EDMX_GENERATION,
6
+ SKIP_PACKAGE_JSON_GENERATION, CONTENT_EDMX, CONTENT_PACKAGE_JSON, CONTENT_PACKAGELOCK_JSON, CONTENT_NPMRC, CONTENT_CDSRC_JSON, CONTENT_ENV, CONTENT_DEFAULT_ENV_JSON } = require('../../constants')
7
+ const { WARNING } = require('../../buildTaskHandler')
8
+
9
+ class NodeCfModuleBuilder extends BuildTaskHandlerEdmx {
10
+ init() {
11
+ super.init()
12
+ // set unified option values in order to ease access later on
13
+ // default value true
14
+ this.task.options[CONTENT_PACKAGE_JSON] = !this.hasBuildOption(CONTENT_PACKAGE_JSON, false) && !this.hasBuildOption(SKIP_PACKAGE_JSON_GENERATION, true) ? true : false
15
+ this.task.options[CONTENT_PACKAGELOCK_JSON] = !this.hasBuildOption(CONTENT_PACKAGELOCK_JSON, false) ? true : false
16
+ this.task.options[CONTENT_NPMRC] = !this.hasBuildOption(CONTENT_NPMRC, false) ? true : false
17
+ this.task.options[CONTENT_CDSRC_JSON] = !this.hasBuildOption(CONTENT_CDSRC_JSON, false) ? true : false
18
+
19
+ // default value false
20
+ this.task.options[CONTENT_EDMX] = this.hasBuildOption(CONTENT_EDMX, true) || this.hasCdsEnvOption(BUILD_NODEJS_EDMX_GENERAION, true) || this.hasBuildOption(EDMX_GENERATION, true) ? true : false
21
+ this.task.options[CONTENT_ENV] = this.hasBuildOption(CONTENT_ENV, true) ? true : false
22
+ this.task.options[CONTENT_DEFAULT_ENV_JSON] = this.hasBuildOption(CONTENT_DEFAULT_ENV_JSON, true) ? true : false
23
+
24
+ if (this.task.options.compileDest) {
25
+ throw new BuildError("Option not supported - compileDest")
26
+ }
27
+ // fallback if src has been defined as '.'
28
+ this.destSrv = this.isStagingBuild() ? path.resolve(this.task.dest, this.env.folders.srv) : path.join(this.task.dest, FOLDER_GEN)
29
+ }
30
+
31
+ async build() {
32
+ const destSrv = this.isStagingBuild() ? this.destSrv : path.resolve(this.destSrv, this.env.folders.srv)
33
+ const destRoot = this.isStagingBuild() ? this.task.dest : this.destSrv
34
+
35
+ if (this.env.get(ODATA_VERSION) === ODATA_VERSION_V2) {
36
+ // log warning as nodejs is only supporting odata version V4
37
+ this.pushMessage("OData v2 is not supported by node runtime. Make sure to define OData v2 in cds configuration.", WARNING)
38
+ }
39
+ // by default model contains all features
40
+ const model = await this.model()
41
+ if (!model) {
42
+ return this._result
43
+ }
44
+
45
+ const { dictionary, sources } = await this.compileAll(model, destSrv, destRoot)
46
+
47
+ // collect and write language bundles into single i18n.json file
48
+ await this.collectAllLanguageBundles(dictionary, sources, destSrv, destRoot)
49
+
50
+ if (this.hasBuildOption(CONTENT_EDMX, true)) {
51
+ await this.compileToEdmx(dictionary.base, this.destSrv)
52
+ }
53
+
54
+ if (!this.hasBuildOption(BUILD_OPTION_OUTPUT_MODE, OUTPUT_MODE_RESULT_ONLY)) {
55
+ const srcSrv = this.task.src === this.buildOptions.root ? path.resolve(this.task.src, this.env.folders.srv) : this.task.src
56
+ await this._copyNativeContent(this.buildOptions.root, srcSrv, destRoot, destSrv)
57
+ }
58
+ return this._result
59
+ }
60
+
61
+ async clean() {
62
+ // staging build content is deleted by BuildTaskEngine
63
+ if (this.buildOptions.target === this.buildOptions.root) {
64
+ // delete the entire 'task.dest' folder otherwise, for details see #constructor
65
+ // - the value of the folder 'src' has been appended to the origin 'task.dest' dir
66
+ this.logger._debug && this.logger.debug(`Deleting build target folder ${this.destSrv}`)
67
+ await fs.promises.rm(this.isStagingBuild() ? this.task.dest : this.destSrv, { force: true, recursive: true })
68
+ }
69
+ }
70
+
71
+ async _copyNativeContent(srcRoot, srcSrv, destRoot, destSrv) {
72
+ // project/srv/** -> 'gen/srv/srv/**'
73
+ const filesFilter = await this._copySrvContent(srcSrv, destRoot, destSrv)
74
+
75
+ // project/* -> 'gen/srv/*'
76
+ await this._copyProjectRootContent(srcRoot, destRoot, (entry) => !filesFilter.includes(path.basename(entry)))
77
+ }
78
+
79
+ /**
80
+ * Copy files from the given <em>src</em>' folder (e.g. 'project/srv') to either <em>destRoot</em> (e.g. 'project/gen/srv')
81
+ * or <em>destSrv</em> (e.g. 'project/gen/srv/srv') folders according to the file semantics.
82
+ * Files with project semantics like 'package.json' or '.npmrc' file are copied to <em>destRoot</em> while others like '.js' service handlers
83
+ * are copied to <em>destSrv</em>.
84
+ * @param {*} src
85
+ * @param {*} destRoot - folder name representing the app root folder (e.g. gen/srv)
86
+ * @param {*} destSrv - folder name representing the app sub-folder (e.g. gen/srv/srv)
87
+ * @returns the list of files that have been copied
88
+ */
89
+ async _copySrvContent(src, destRoot, destSrv) {
90
+ const srvRootBlockList = RegExp('package\\.json$|package-lock\\.json$|\\.npmrc$|\\.cdsrc\\.json$')
91
+ const srvBlockList = RegExp('\\.cds$|csn\\.json$|\\.csn$|manifest\\.y.?ml$|\\.env($|\\..*$)|default-env\\.json$')
92
+ const srvRootFileNames = []
93
+
94
+ // 1. copy all files to 'destSrv' except those contained in the blocklist (including node_modules)
95
+ // project/srv -> 'gen/srv/srv'
96
+ await super.copyNativeContent(src, destSrv, (entry) => {
97
+ if (fs.statSync(entry).isDirectory()) {
98
+ // TODO shall not copy language bundles - return !/(\/|\\)(node_modules|_i18n)(\/|\\)?$/.test(entry)
99
+ return !/(\/|\\)node_modules(\/|\\)?$/.test(entry)
100
+ }
101
+ if (srvRootBlockList.test(entry)) {
102
+ srvRootFileNames.push(path.basename(entry))
103
+ return false
104
+ }
105
+ return !srvBlockList.test(entry)
106
+ })
107
+
108
+ // 2. copy dedicated files like package.json, .npmrc to 'destRoot'
109
+ // project/srv -> 'gen/srv'
110
+ let srvAllowList = "package\\.json$" // always copy package.json, modify only if CONTENT_PACKAGE_JSON is true
111
+ srvAllowList += this.hasBuildOption(CONTENT_PACKAGELOCK_JSON, true) ? "|package-lock\\.json$" : ""
112
+ srvAllowList += this.hasBuildOption(CONTENT_NPMRC, true) ? "|\\.npmrc$" : ""
113
+ srvAllowList += this.hasBuildOption(CONTENT_CDSRC_JSON, true) ? "|\\.cdsrc\\.json$" : ""
114
+ srvAllowList += this.hasBuildOption(CONTENT_ENV, true) ? "|\\.env($|\\..*$)" : ""
115
+ srvAllowList += this.hasBuildOption(CONTENT_DEFAULT_ENV_JSON, true) ? "|default-env\\.json$" : ""
116
+ srvAllowList = new RegExp(srvAllowList)
117
+ await Promise.all(srvRootFileNames.map(fileName => {
118
+ if (srvAllowList.test(fileName)) {
119
+ return this.copy(path.join(src, fileName)).to(path.join(destRoot, fileName))
120
+ }
121
+ }))
122
+ return srvRootFileNames
123
+ }
124
+
125
+ /**
126
+ * Copy dedicated files (files with project semantics like package.json, .npmrc, .cdsrc, etc.)
127
+ * from the given <em>src</em> folder (e.g. 'project') into the given <em>dest</em> folder (e.g. 'project/gen/srv')
128
+ * @param {*} src
129
+ * @param {*} dest
130
+ * @param {*} filter - copy file if filter function returns true
131
+ */
132
+ async _copyProjectRootContent(src, dest, filter) {
133
+ let { folders = ['i18n'] } = this.env.i18n
134
+ folders.push('handlers')
135
+ folders = folders.map(folder => path.join(src, folder))
136
+ let srvAllowList = "package\\.json$" // always copy package.json, modify only if CONTENT_PACKAGE_JSON is true
137
+ srvAllowList += this.hasBuildOption(CONTENT_PACKAGELOCK_JSON, true) ? "|package-lock\\.json$" : ""
138
+ srvAllowList += this.hasBuildOption(CONTENT_NPMRC, true) ? "|\\.npmrc$" : ""
139
+ srvAllowList += this.hasBuildOption(CONTENT_CDSRC_JSON, true) ? "|\\.cdsrc\\.json$" : ""
140
+ srvAllowList += this.hasBuildOption(CONTENT_ENV, true) ? "|\\.env($|\\..*$)" : ""
141
+ srvAllowList += this.hasBuildOption(CONTENT_DEFAULT_ENV_JSON, true) ? "|default-env\\.json$" : ""
142
+ srvAllowList = new RegExp(srvAllowList)
143
+
144
+ await super.copyNativeContent(src, dest, (entry) => {
145
+ if (fs.statSync(entry).isDirectory()) {
146
+ return folders.some(folder => entry.startsWith(folder))
147
+ }
148
+ if (/\.js$|\.properties$/.test(entry)) {
149
+ return true
150
+ }
151
+ return srvAllowList.test(entry) && (!filter || filter.call(this, entry))
152
+ })
153
+
154
+ if (this.hasBuildOption(CONTENT_PACKAGE_JSON, true) && fs.existsSync(path.join(dest, 'package.json'))) {
155
+ await this._modifyPackageJson(path.join(dest, 'package.json'))
156
+ }
157
+ }
158
+
159
+ /**
160
+ * Modify package.json file defined by the given file path.
161
+ * @param {string} file
162
+ */
163
+ async _modifyPackageJson(file) {
164
+ function _addEnginesField(content) {
165
+ if (!content.engines || !content.engines.node) {
166
+ const { engines } = require('../../../../package.json')
167
+ if (engines && engines.node) {
168
+ this.logger.log(`${this.task.for}: adding node engines version to package.json ${engines.node}`)
169
+ content.engines = content.engines || {}
170
+ content.engines.node = engines.node
171
+ return true
172
+ }
173
+ }
174
+ return false
175
+ }
176
+
177
+ let content = await fs.promises.readFile(file)
178
+ let changed = false
179
+ if (content) {
180
+ content = JSON.parse(content)
181
+ changed |= _addEnginesField.call(this, content)
182
+ }
183
+ if (changed) {
184
+ await this.write(content).to(file)
185
+ }
186
+ }
187
+ }
188
+
189
+ module.exports = NodeCfModuleBuilder
package/bin/build/util.js CHANGED
@@ -1,4 +1,4 @@
1
- const { fs } = require('@sap/cds-foss')
1
+ const fs = require('fs')
2
2
  const path = require('path')
3
3
  const { SEVERITY_ERROR } = require('./constants')
4
4
 
@@ -84,36 +84,13 @@ async function isOldJavaStack(dirs) {
84
84
  const files = readPomFilePaths(dirs)
85
85
  if (files.length > 0) {
86
86
  return (await Promise.all(files.map(async file => {
87
- const content = await fs.readFile(file, 'utf-8')
87
+ const content = await fs.promises.readFile(file, 'utf-8')
88
88
  return content && /<groupId>\s*com\.sap\.cloud\.servicesdk/.test(content) && !(/<groupId>\s*com\.sap\.cds\s*<\/groupId>/.test(content) && /<artifactId>\s*cds-/.test(content))
89
89
  }))).some(result => result)
90
90
  }
91
91
  return false
92
92
  }
93
93
 
94
- /**
95
- * Returns a promise that resolves after all of the given promises have either resolved or rejected,
96
- * with an array of objects that each describes the outcome of each promise.
97
- *
98
- * @param {*} promises An iterable object, such as an Array, in which each member is a Promise.
99
- * @returns A pending Promise that will be asynchronously fulfilled once every promise in the specified
100
- * collection of promises has completed, either by successfully being fulfilled or by being rejected.
101
- * At that time, the returned promise's handler is passed as input an array containing the outcome of
102
- * each promise in the original set of promises.<br>
103
- * For each outcome object, a status string is present. If the status is fulfilled, then a value is present.
104
- * If the status is rejected, then a reason is present. The value (or reason) reflects what value each
105
- * promise was fulfilled (or rejected) with.
106
- */
107
- function allSettled(promises) {
108
- let wrappedPromises = Array.from(promises).map(p =>
109
- Promise.resolve(p).then(
110
- val => ({ state: 'fulfilled', value: val }),
111
- err => ({ state: 'rejected', reason: err })
112
- )
113
- );
114
- return Promise.all(wrappedPromises);
115
- }
116
-
117
94
  function redactCredentials(config, o) {
118
95
  return JSON.stringify(config, (k, v) => {
119
96
  if (!v) {
@@ -128,10 +105,6 @@ function redactCredentials(config, o) {
128
105
  }, o && o.indents || 2)
129
106
  }
130
107
 
131
- function isAbsolutePath(pathName) {
132
- return /^(?:\/|[a-z]+:\/\/)/.test(pathName)
133
- }
134
-
135
108
  /** redacts password-like strings, also reducing clutter in output */
136
109
  function _redacted(cred) {
137
110
  const secrets = /(password)|(certificate)|(ca)/i // 'certificate' and 'ca' on HANA
@@ -142,6 +115,22 @@ function _redacted(cred) {
142
115
  return newCred
143
116
  }
144
117
 
118
+ /**
119
+ * Distinguishes whether the project uses the new ModelProviderService based approach as
120
+ * defined by the new Streamlined MTX (cds >=6) or whether it represents an old MTX project
121
+ * using the cds-mtx library.
122
+ *
123
+ * @param {object} env
124
+ * @returns
125
+ */
126
+ function isStreamlinedMtx(cds) {
127
+ if (process.env.OLD_MTX) return false
128
+ return !cds.mtx && (cds.env.get("requires.toggles") !== undefined
129
+ || cds.env.requires['cds.xt.ModelProviderService']
130
+ || cds.env.get("requires.multitenancy.streamlined") === true
131
+ || (typeof cds.env.get("requires.multitenancy") === "object" && cds.env.get("requires.multitenancy.streamlined") === undefined))
132
+ }
133
+
145
134
  class BuildMessage extends Error {
146
135
  constructor(message, severity) {
147
136
  super(message)
@@ -175,11 +164,10 @@ module.exports = {
175
164
  setProperty,
176
165
  hasJavaNature,
177
166
  isOldJavaStack,
178
- allSettled,
179
167
  redactCredentials,
180
168
  hasOptionValue,
181
169
  relativePaths,
182
- isAbsolutePath,
170
+ isStreamlinedMtx,
183
171
  BuildMessage,
184
172
  BuildError
185
173
  }
package/bin/cds.js CHANGED
@@ -16,11 +16,13 @@ const cli = { //NOSONAR
16
16
  if (process.env.NODE_ENV !== 'test') this.errorHandlers()
17
17
  if (cmd in this.Shortcuts) cmd = process.argv[2] = this.Shortcuts[cmd]
18
18
  let task = this.load ('./'+cmd)
19
- if (task) return task.apply (this, this.args(task,argv))
19
+ if (task && cmd !== 'build') return task.apply (this, this.args(task,argv))
20
20
 
21
- // delegate to cds-dk for rest of commands (usually shortcuts like `cds c`)
21
+ // delegate to cds-dk for rest of commands (usually shortcuts like `cds c` including cds build if cds-dk is available)
22
22
  const dk = _requireDk('cds')
23
- return dk ? dk.exec(cmd, ...argv) : _die_needsDk (cmd)
23
+ if (dk) return dk.exec(cmd, ...argv)
24
+ if (cmd === 'build') return task.apply (this, this.args(task,argv))
25
+ _die_needsDk (cmd)
24
26
  },
25
27
 
26
28
  load (cmd) {
@@ -1,4 +1,7 @@
1
1
  const cp = require('child_process');
2
+ const fsp = require('fs').promises;
3
+ const os = require('os');
4
+ const path = require('path');
2
5
 
3
6
  const cds = require('../../../lib');
4
7
  const LOG = cds.log ? cds.log('deploy') : console;
@@ -27,6 +30,7 @@ class CfUtil {
27
30
  async _cfRun(...args) {
28
31
  const cmdLine = `${CF_COMMAND} ${args.join(' ')}`;
29
32
  if (DEBUG) {
33
+ // eslint-disable-next-line no-console
30
34
  console.time(cmdLine);
31
35
  LOG.debug('>>> ' + cmdLine);
32
36
  }
@@ -65,6 +69,7 @@ class CfUtil {
65
69
  });
66
70
  });
67
71
  } finally {
72
+ // eslint-disable-next-line no-console
68
73
  DEBUG && console.timeEnd(cmdLine);
69
74
  }
70
75
  }
@@ -100,22 +105,42 @@ class CfUtil {
100
105
  return match[1];
101
106
  }
102
107
 
108
+ async getCfTargetFromConfigFile() {
109
+ const cfHome = process.env.CF_HOME || process.env.cf_home || path.join(os.homedir(), '.cf');
110
+ try {
111
+ const fileContent = await fsp.readFile(path.join(cfHome, 'config.json'));
112
+ const config = JSON.parse(fileContent);
113
+ if (config) {
114
+ return {
115
+ apiEndpoint: this._extract(config.Target, /\s*(.+)\s*/, `CF API endpoint is missing. Use 'cf login' to login.`),
116
+ org: this._extract(config.OrganizationFields.Name, /\s*(.+)\s*/, `CF org is missing. Use 'cf target -o <ORG> to specify.`),
117
+ space: this._extract(config.SpaceFields.Name, /\s*(.+)\s*/, `CF space is missing. Use 'cf target -s <SPACE>' to specify.`)
118
+ }
119
+ }
120
+ } catch (err) {
121
+ LOG.debug(`getCfTargetFromConfigFile: ${err}`);
122
+ }
123
+ }
124
+
103
125
  async getCfTargetFromCli() {
104
126
  const result = await this._cfRun('target');
105
-
106
127
  return {
107
- apiEndpoint: this._extract(result, /api endpoint\s*:\s*(.*)/i, `CF API endpoint is missing. Use 'cf login' to login.`),
108
- user: this._extract(result, /user\s*:\s*(.*)/i, `CF user is missing. Use 'cf login' to login.`),
109
- org: this._extract(result, /org\s*:\s*(.*)/i, `CF org is missing. Use 'cf target -o <ORG> to specify.`),
110
- space: this._extract(result, /space\s*:\s*(.*)/i, `CF space is missing. Use 'cf target -s <SPACE>' to specify.`),
128
+ apiEndpoint: this._extract(result, /api endpoint\s*:\s*(.+)/i, `CF API endpoint is missing. Use 'cf login' to login.`),
129
+ user: this._extract(result, /user\s*:\s*(.+)/i, `CF user is missing. Use 'cf login' to login.`),
130
+ org: this._extract(result, /org\s*:\s*(.+)/i, `CF org is missing. Use 'cf target -o <ORG> to specify.`),
131
+ space: this._extract(result, /space\s*:\s*(.+)/i, `CF space is missing. Use 'cf target -s <SPACE>' to specify.`),
111
132
  };
112
133
  }
113
134
 
135
+ async getCfTarget() {
136
+ return await this.getCfTargetFromConfigFile() || await this.getCfTargetFromCli();
137
+ }
138
+
114
139
  async getCfSpaceInfo() {
115
140
  if (!this.spaceInfo) {
116
141
  DEBUG && LOG.debug('getting space info');
117
142
 
118
- const target = await this.getCfTargetFromCli();
143
+ const target = await this.getCfTarget();
119
144
 
120
145
  const { org, space } = target;
121
146
  const orgs = await this._cfRequest(`/v3/organizations`, { names: org });