@sap/cds 5.9.8 → 6.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (381) hide show
  1. package/CHANGELOG.md +252 -20
  2. package/apis/services.d.ts +1 -1
  3. package/app/fiori/preview.js +2 -6
  4. package/app/index.js +3 -3
  5. package/bin/build/buildTaskEngine.js +17 -15
  6. package/bin/build/buildTaskFactory.js +29 -19
  7. package/bin/build/buildTaskHandler.js +27 -11
  8. package/bin/build/buildTaskProvider.js +2 -4
  9. package/bin/build/buildTaskProviderFactory.js +11 -16
  10. package/bin/build/constants.js +14 -6
  11. package/bin/build/csv-reader.js +2 -1
  12. package/bin/build/index.js +12 -18
  13. package/bin/build/provider/buildTaskHandlerEdmx.js +3 -39
  14. package/bin/build/provider/buildTaskHandlerFeatureToggles.js +149 -0
  15. package/bin/build/provider/buildTaskHandlerInternal.js +2 -3
  16. package/bin/build/provider/buildTaskProviderInternal.js +108 -239
  17. package/bin/build/provider/fiori/index.js +2 -2
  18. package/bin/build/provider/hana/2migration.js +11 -11
  19. package/bin/build/provider/hana/2tabledata.js +3 -3
  20. package/bin/build/provider/hana/index.js +89 -99
  21. package/bin/build/provider/hana/migrationtable.js +4 -3
  22. package/bin/build/provider/java/index.js +101 -0
  23. package/bin/build/provider/java-cf/index.js +1 -101
  24. package/bin/build/provider/mtx/index.js +83 -41
  25. package/bin/build/provider/mtx/resourcesTarBuilder.js +68 -0
  26. package/bin/build/provider/mtx-sidecar/index.js +80 -0
  27. package/bin/build/provider/node-cf/index.js +1 -308
  28. package/bin/build/provider/nodejs/index.js +189 -0
  29. package/bin/build/util.js +19 -31
  30. package/bin/cds.js +5 -3
  31. package/bin/deploy/to-hana/cfUtil.js +31 -6
  32. package/bin/deploy/to-hana/gitUtil.js +5 -3
  33. package/bin/deploy/to-hana/hana.js +9 -10
  34. package/bin/{build → deploy/to-hana}/mtaUtil.js +10 -9
  35. package/bin/mtx/in-cds.js +19 -7
  36. package/bin/serve.js +56 -21
  37. package/bin/utils/log.js +13 -30
  38. package/bin/version.js +4 -3
  39. package/common.cds +61 -16
  40. package/lib/compile/cdsc.js +3 -2
  41. package/lib/compile/etc/_localized.js +15 -14
  42. package/lib/compile/for/drafts.js +3 -4
  43. package/lib/compile/for/java.js +13 -10
  44. package/lib/compile/for/nodejs.js +8 -8
  45. package/lib/compile/for/odata.js +7 -12
  46. package/lib/compile/for/sql.js +5 -6
  47. package/lib/compile/index.js +5 -4
  48. package/lib/compile/load.js +9 -11
  49. package/lib/compile/minify.js +8 -5
  50. package/lib/compile/parse.js +4 -2
  51. package/lib/compile/resolve.js +18 -15
  52. package/lib/compile/to/edm.js +0 -1
  53. package/lib/compile/to/gql.js +3 -2
  54. package/lib/compile/to/json.js +24 -17
  55. package/lib/connect/bindings.js +3 -2
  56. package/lib/connect/index.js +5 -5
  57. package/lib/core/classes.js +74 -2
  58. package/lib/core/entities.js +52 -3
  59. package/lib/core/reflect.js +2 -1
  60. package/lib/deploy.js +11 -8
  61. package/lib/env/defaults.js +4 -3
  62. package/lib/env/index.js +71 -31
  63. package/lib/env/presets.js +1 -14
  64. package/lib/env/requires.js +70 -20
  65. package/lib/env/serviceBindings.js +147 -0
  66. package/lib/i18n/localize.js +22 -23
  67. package/lib/index.js +148 -144
  68. package/lib/log/errors.js +55 -12
  69. package/lib/log/format/kibana.js +1 -1
  70. package/lib/log/index.js +4 -0
  71. package/lib/ql/SELECT.js +7 -2
  72. package/lib/ql/Whereable.js +8 -2
  73. package/lib/ql/index.js +2 -2
  74. package/lib/req/assert.js +71 -0
  75. package/lib/req/cds-context.js +38 -70
  76. package/lib/req/context.js +34 -21
  77. package/lib/req/request.js +12 -18
  78. package/lib/req/response.js +6 -2
  79. package/lib/req/user.js +30 -22
  80. package/lib/serve/Service-api.js +17 -12
  81. package/lib/serve/Service-dispatch.js +5 -9
  82. package/lib/serve/Service-methods.js +4 -3
  83. package/lib/serve/Transaction.js +24 -21
  84. package/lib/serve/adapters.js +15 -5
  85. package/lib/serve/factory.js +23 -20
  86. package/lib/serve/index.js +51 -54
  87. package/lib/utils/axios.js +8 -12
  88. package/lib/utils/index.js +3 -3
  89. package/lib/utils/resources/index.js +1 -44
  90. package/lib/utils/resources/tar.js +2 -1
  91. package/lib/utils/tests.js +13 -15
  92. package/libx/_runtime/.eslintrc +1 -1
  93. package/libx/_runtime/audit/Service.js +6 -4
  94. package/libx/_runtime/audit/generic/personal/access.js +19 -43
  95. package/libx/_runtime/audit/generic/personal/index.js +40 -34
  96. package/libx/_runtime/audit/generic/personal/modification.js +11 -9
  97. package/libx/_runtime/audit/generic/personal/utils.js +13 -6
  98. package/libx/_runtime/audit/utils/v2.js +6 -3
  99. package/libx/_runtime/auth/index.js +71 -66
  100. package/libx/_runtime/auth/strategies/JWT.js +3 -2
  101. package/libx/_runtime/auth/strategies/mock.js +54 -53
  102. package/libx/_runtime/auth/strategies/xssecUtils.js +3 -4
  103. package/libx/_runtime/auth/strategies/xsuaa.js +3 -2
  104. package/libx/_runtime/auth/utils.js +2 -15
  105. package/libx/_runtime/cds-services/adapter/odata-v4/Dispatcher.js +127 -41
  106. package/libx/_runtime/cds-services/adapter/odata-v4/OData.js +6 -3
  107. package/libx/_runtime/cds-services/adapter/odata-v4/ODataRequest.js +93 -73
  108. package/libx/_runtime/cds-services/adapter/odata-v4/handlers/action.js +10 -45
  109. package/libx/_runtime/cds-services/adapter/odata-v4/handlers/create.js +5 -9
  110. package/libx/_runtime/cds-services/adapter/odata-v4/handlers/error.js +9 -5
  111. package/libx/_runtime/cds-services/adapter/odata-v4/handlers/metadata.js +4 -2
  112. package/libx/_runtime/cds-services/adapter/odata-v4/handlers/read.js +60 -53
  113. package/libx/_runtime/cds-services/adapter/odata-v4/handlers/request.js +1 -1
  114. package/libx/_runtime/cds-services/adapter/odata-v4/handlers/update.js +15 -21
  115. package/libx/_runtime/cds-services/adapter/odata-v4/odata-to-cqn/ExpressionToCQN.js +8 -15
  116. package/libx/_runtime/cds-services/adapter/odata-v4/odata-to-cqn/expandToCQN.js +29 -41
  117. package/libx/_runtime/cds-services/adapter/odata-v4/odata-to-cqn/index.js +1 -4
  118. package/libx/_runtime/cds-services/adapter/odata-v4/odata-to-cqn/readToCQN.js +13 -13
  119. package/libx/_runtime/cds-services/adapter/odata-v4/odata-to-cqn/selectToCQN.js +0 -7
  120. package/libx/_runtime/cds-services/adapter/odata-v4/odata-to-cqn/utils.js +24 -1
  121. package/libx/_runtime/cds-services/adapter/odata-v4/okra/odata-commons/edm/EdmEntityContainer.js +1 -1
  122. package/libx/_runtime/cds-services/adapter/odata-v4/okra/odata-commons/uri/UriHelper.js +4 -3
  123. package/libx/_runtime/cds-services/adapter/odata-v4/okra/odata-commons/utils/PrimitiveValueDecoder.js +4 -5
  124. package/libx/_runtime/cds-services/adapter/odata-v4/okra/odata-commons/utils/ValueConverter.js +4 -3
  125. package/libx/_runtime/cds-services/adapter/odata-v4/okra/odata-commons/validator/ValueValidator.js +5 -3
  126. package/libx/_runtime/cds-services/adapter/odata-v4/okra/odata-server/core/ResponseHeaderSetter.js +2 -0
  127. package/libx/_runtime/cds-services/adapter/odata-v4/okra/odata-server/invocation/DebugSerializingCommand.js +1 -1
  128. package/libx/_runtime/cds-services/adapter/odata-v4/okra/odata-server/invocation/PresetResponseHeadersCommand.js +1 -1
  129. package/libx/_runtime/cds-services/adapter/odata-v4/okra/odata-server/invocation/SerializingCommand.js +1 -1
  130. package/libx/_runtime/cds-services/adapter/odata-v4/okra/odata-server/invocation/SetResponseHeadersCommand.js +1 -1
  131. package/libx/_runtime/cds-services/adapter/odata-v4/okra/odata-server/serializer/ContextURLFactory.js +3 -2
  132. package/libx/_runtime/cds-services/adapter/odata-v4/okra/odata-server/serializer/ErrorJsonSerializer.js +3 -1
  133. package/libx/_runtime/cds-services/adapter/odata-v4/okra/odata-server/serializer/SerializerFactory.js +1 -0
  134. package/libx/_runtime/cds-services/adapter/odata-v4/okra/odata-server/serializer/TrustedResourceJsonSerializer.js +3 -3
  135. package/libx/_runtime/cds-services/adapter/odata-v4/utils/data.js +36 -25
  136. package/libx/_runtime/cds-services/adapter/odata-v4/utils/handlerUtils.js +100 -91
  137. package/libx/_runtime/cds-services/adapter/odata-v4/utils/metaInfo.js +382 -0
  138. package/libx/_runtime/cds-services/adapter/odata-v4/utils/oDataConfiguration.js +1 -4
  139. package/libx/_runtime/cds-services/adapter/odata-v4/utils/omitValues.js +5 -6
  140. package/libx/_runtime/cds-services/adapter/odata-v4/utils/readAfterWrite.js +77 -21
  141. package/libx/_runtime/cds-services/adapter/odata-v4/utils/request.js +3 -11
  142. package/libx/_runtime/cds-services/adapter/odata-v4/utils/result.js +91 -69
  143. package/libx/_runtime/cds-services/adapter/odata-v4/utils/stream.js +27 -6
  144. package/libx/_runtime/cds-services/adapter/rest/utils/validation-checks.js +7 -17
  145. package/libx/_runtime/cds-services/services/Service.js +17 -76
  146. package/libx/_runtime/cds-services/services/utils/columns.js +6 -4
  147. package/libx/_runtime/cds-services/services/utils/compareJson.js +1 -53
  148. package/libx/_runtime/cds-services/services/utils/differ.js +15 -19
  149. package/libx/_runtime/cds-services/util/assert.js +107 -34
  150. package/libx/_runtime/cds.js +1 -31
  151. package/libx/_runtime/common/aspects/Association.js +40 -54
  152. package/libx/_runtime/common/aspects/any.js +61 -6
  153. package/libx/_runtime/common/aspects/entity.js +19 -79
  154. package/libx/_runtime/common/composition/data.js +2 -2
  155. package/libx/_runtime/common/composition/delete.js +8 -7
  156. package/libx/_runtime/common/composition/tree.js +10 -10
  157. package/libx/_runtime/common/composition/update.js +3 -2
  158. package/libx/_runtime/common/constants/events.js +15 -0
  159. package/libx/_runtime/common/error/entry.js +9 -3
  160. package/libx/_runtime/common/error/frontend.js +13 -19
  161. package/libx/_runtime/common/error/index.js +8 -3
  162. package/libx/_runtime/common/generic/auth/capabilities.js +2 -1
  163. package/libx/_runtime/common/generic/auth/constants.js +1 -4
  164. package/libx/_runtime/common/generic/auth/requires.js +1 -1
  165. package/libx/_runtime/common/generic/auth/restrict.js +12 -28
  166. package/libx/_runtime/common/generic/auth/restrictions.js +12 -4
  167. package/libx/_runtime/common/generic/auth/utils.js +2 -1
  168. package/libx/_runtime/common/generic/crud.js +9 -60
  169. package/libx/_runtime/common/generic/etag.js +41 -7
  170. package/libx/_runtime/common/generic/input.js +128 -66
  171. package/libx/_runtime/common/generic/paging.js +9 -3
  172. package/libx/_runtime/common/generic/put.js +2 -2
  173. package/libx/_runtime/common/generic/sorting.js +7 -3
  174. package/libx/_runtime/common/generic/temporal.js +0 -5
  175. package/libx/_runtime/common/i18n/messages.properties +2 -1
  176. package/libx/_runtime/common/utils/binary.js +69 -0
  177. package/libx/_runtime/common/utils/cqn.js +39 -14
  178. package/libx/_runtime/common/utils/cqn2cqn4sql.js +93 -59
  179. package/libx/_runtime/common/utils/csn.js +87 -85
  180. package/libx/_runtime/common/utils/dollar.js +8 -7
  181. package/libx/_runtime/common/utils/draft.js +1 -1
  182. package/libx/_runtime/common/utils/foreignKeyPropagations.js +23 -7
  183. package/libx/_runtime/common/utils/generateOnCond.js +2 -1
  184. package/libx/_runtime/common/utils/keys.js +30 -13
  185. package/libx/_runtime/common/utils/postProcessing.js +6 -1
  186. package/libx/_runtime/common/utils/quotingStyles.js +0 -23
  187. package/libx/_runtime/common/utils/resolveStructured.js +23 -26
  188. package/libx/_runtime/common/utils/resolveView.js +4 -1
  189. package/libx/_runtime/common/utils/rewriteAsterisks.js +3 -0
  190. package/libx/_runtime/common/utils/search2cqn4sql.js +4 -13
  191. package/libx/_runtime/common/utils/searchToLike.js +9 -13
  192. package/libx/_runtime/common/utils/streamProp.js +35 -0
  193. package/libx/_runtime/common/utils/structured.js +12 -18
  194. package/libx/_runtime/common/utils/template.js +3 -5
  195. package/libx/_runtime/common/utils/templateProcessor.js +22 -14
  196. package/libx/_runtime/common/utils/unionCqnTemplate.js +4 -14
  197. package/libx/_runtime/db/Service.js +2 -1
  198. package/libx/_runtime/db/expand/expand-v2.js +2 -2
  199. package/libx/_runtime/db/expand/expandCQNToJoin.js +7 -6
  200. package/libx/_runtime/db/generic/input.js +14 -17
  201. package/libx/_runtime/db/generic/integrity.js +1 -2
  202. package/libx/_runtime/db/generic/update.js +14 -1
  203. package/libx/_runtime/db/query/read.js +0 -1
  204. package/libx/_runtime/db/query/update.js +1 -1
  205. package/libx/_runtime/db/sql-builder/BaseBuilder.js +1 -1
  206. package/libx/_runtime/db/sql-builder/ExpressionBuilder.js +5 -31
  207. package/libx/_runtime/db/sql-builder/InsertBuilder.js +1 -1
  208. package/libx/_runtime/db/sql-builder/ReferenceBuilder.js +0 -9
  209. package/libx/_runtime/db/sql-builder/SelectBuilder.js +11 -10
  210. package/libx/_runtime/db/sql-builder/UpdateBuilder.js +2 -2
  211. package/libx/_runtime/db/sql-builder/annotations.js +1 -2
  212. package/libx/_runtime/db/utils/coloredTxCommands.js +5 -0
  213. package/libx/_runtime/db/utils/columns.js +1 -1
  214. package/libx/_runtime/db/utils/propagateForeignKeys.js +10 -2
  215. package/libx/_runtime/extensibility/activate.js +69 -0
  216. package/libx/_runtime/extensibility/add.js +41 -0
  217. package/libx/_runtime/extensibility/addExtension.js +68 -0
  218. package/libx/_runtime/extensibility/defaults.js +39 -0
  219. package/libx/_runtime/extensibility/{uiflex/handler → handler}/transformREAD.js +0 -0
  220. package/libx/_runtime/extensibility/{uiflex/handler → handler}/transformRESULT.js +2 -2
  221. package/libx/_runtime/extensibility/{uiflex/handler → handler}/transformWRITE.js +2 -2
  222. package/libx/_runtime/extensibility/push.js +61 -0
  223. package/libx/_runtime/extensibility/service.js +21 -0
  224. package/libx/_runtime/extensibility/{uiflex/utils.js → utils.js} +39 -3
  225. package/libx/_runtime/extensibility/validation.js +53 -0
  226. package/libx/_runtime/extensibility/views.js +12 -0
  227. package/libx/_runtime/fiori/generic/activate.js +6 -4
  228. package/libx/_runtime/fiori/generic/before.js +17 -29
  229. package/libx/_runtime/fiori/generic/cancel.js +2 -4
  230. package/libx/_runtime/fiori/generic/delete.js +2 -4
  231. package/libx/_runtime/fiori/generic/edit.js +3 -7
  232. package/libx/_runtime/fiori/generic/index.js +31 -0
  233. package/libx/_runtime/fiori/generic/new.js +2 -4
  234. package/libx/_runtime/fiori/generic/patch.js +4 -8
  235. package/libx/_runtime/fiori/generic/prepare.js +2 -4
  236. package/libx/_runtime/fiori/generic/read.js +137 -162
  237. package/libx/_runtime/fiori/generic/readOverDraft.js +10 -4
  238. package/libx/_runtime/fiori/utils/handler.js +10 -5
  239. package/libx/_runtime/fiori/utils/where.js +1 -4
  240. package/libx/_runtime/hana/Service.js +14 -7
  241. package/libx/_runtime/hana/customBuilder/CustomSelectBuilder.js +1 -1
  242. package/libx/_runtime/hana/dynatrace.js +2 -2
  243. package/libx/_runtime/hana/localized.js +7 -6
  244. package/libx/_runtime/hana/pool.js +9 -6
  245. package/libx/_runtime/hana/search.js +2 -3
  246. package/libx/_runtime/hana/{searchToContains.js → search2Contains.js} +5 -2
  247. package/libx/_runtime/hana/search2cqn4sql.js +20 -17
  248. package/libx/_runtime/index.js +2 -6
  249. package/libx/_runtime/messaging/AMQPWebhookMessaging.js +11 -2
  250. package/libx/_runtime/messaging/common-utils/AMQPClient.js +4 -3
  251. package/libx/_runtime/messaging/common-utils/appId.js +9 -0
  252. package/libx/_runtime/messaging/common-utils/authorizedRequest.js +2 -18
  253. package/libx/_runtime/messaging/common-utils/connections.js +1 -1
  254. package/libx/_runtime/messaging/enterprise-messaging-shared.js +2 -2
  255. package/libx/_runtime/messaging/enterprise-messaging-utils/EMManagement.js +305 -231
  256. package/libx/_runtime/messaging/enterprise-messaging-utils/cloudEvents.js +2 -2
  257. package/libx/_runtime/messaging/enterprise-messaging-utils/options-management.js +15 -8
  258. package/libx/_runtime/messaging/enterprise-messaging-utils/options-messaging.js +57 -14
  259. package/libx/_runtime/messaging/enterprise-messaging.js +14 -19
  260. package/libx/_runtime/messaging/file-based.js +2 -1
  261. package/libx/_runtime/messaging/http-utils/token.js +18 -6
  262. package/libx/_runtime/messaging/message-queuing-utils/options-management.js +22 -12
  263. package/libx/_runtime/messaging/message-queuing-utils/options-messaging.js +27 -14
  264. package/libx/_runtime/messaging/message-queuing.js +138 -85
  265. package/libx/_runtime/messaging/outbox/utils.js +13 -7
  266. package/libx/_runtime/messaging/redis-messaging.js +0 -1
  267. package/libx/_runtime/messaging/service.js +4 -1
  268. package/libx/_runtime/remote/Service.js +24 -18
  269. package/libx/_runtime/remote/utils/client.js +84 -46
  270. package/libx/_runtime/remote/utils/data.js +23 -6
  271. package/libx/_runtime/sqlite/Service.js +14 -13
  272. package/libx/_runtime/sqlite/convertAssocToOneManaged.js +2 -0
  273. package/libx/_runtime/sqlite/customBuilder/CustomSelectBuilder.js +1 -0
  274. package/libx/_runtime/sqlite/execute.js +3 -9
  275. package/libx/_runtime/types/api.js +23 -11
  276. package/libx/common/utils/ucsn.js +15 -9
  277. package/libx/odata/afterburner.js +109 -29
  278. package/libx/odata/cqn2odata.js +48 -9
  279. package/libx/odata/grammar.pegjs +261 -157
  280. package/libx/odata/index.js +21 -9
  281. package/libx/odata/parseToCqn.js +8 -5
  282. package/libx/odata/parser.js +1 -1
  283. package/libx/odata/utils.js +13 -3
  284. package/libx/rest/RestAdapter.js +173 -113
  285. package/libx/rest/RestRequest.js +3 -2
  286. package/libx/rest/middleware/create.js +8 -6
  287. package/libx/rest/middleware/delete.js +6 -13
  288. package/libx/rest/middleware/error.js +1 -1
  289. package/libx/rest/middleware/input.js +6 -6
  290. package/libx/rest/middleware/operation.js +8 -3
  291. package/libx/rest/middleware/parse.js +3 -3
  292. package/libx/rest/middleware/payload.js +12 -0
  293. package/libx/rest/middleware/read.js +12 -2
  294. package/libx/rest/middleware/update.js +3 -3
  295. package/package.json +4 -6
  296. package/server.js +3 -44
  297. package/srv/extensibility-service.cds +56 -0
  298. package/srv/extensibility-service.js +1 -0
  299. package/srv/extensions.cds +8 -0
  300. package/srv/model-provider.cds +59 -0
  301. package/srv/model-provider.js +163 -0
  302. package/srv/mtx.cds +2 -0
  303. package/srv/mtx.js +22 -0
  304. package/srv/outbox.cds +2 -0
  305. package/tasks/enterprise-messaging-deploy.js +19 -12
  306. package/lib/serve/Service-compat.js +0 -36
  307. package/libx/_runtime/audit/generic/personal/constants.js +0 -4
  308. package/libx/_runtime/auth/strategies/dwc.js +0 -45
  309. package/libx/_runtime/cds-services/adapter/odata-v4/utils/dispatcherUtils.js +0 -56
  310. package/libx/_runtime/cds-services/adapter/rest/Rest.js +0 -183
  311. package/libx/_runtime/cds-services/adapter/rest/RestRequest.js +0 -67
  312. package/libx/_runtime/cds-services/adapter/rest/handlers/create.js +0 -82
  313. package/libx/_runtime/cds-services/adapter/rest/handlers/delete.js +0 -39
  314. package/libx/_runtime/cds-services/adapter/rest/handlers/operation.js +0 -63
  315. package/libx/_runtime/cds-services/adapter/rest/handlers/read.js +0 -52
  316. package/libx/_runtime/cds-services/adapter/rest/handlers/update.js +0 -81
  317. package/libx/_runtime/cds-services/adapter/rest/rest-to-cqn/index.js +0 -56
  318. package/libx/_runtime/cds-services/adapter/rest/rest-to-cqn/utils.js +0 -33
  319. package/libx/_runtime/cds-services/adapter/rest/to.js +0 -8
  320. package/libx/_runtime/cds-services/adapter/rest/utils/binary.js +0 -50
  321. package/libx/_runtime/cds-services/adapter/rest/utils/data.js +0 -117
  322. package/libx/_runtime/cds-services/adapter/rest/utils/header-checks.js +0 -14
  323. package/libx/_runtime/cds-services/adapter/rest/utils/key-value-utils.js +0 -30
  324. package/libx/_runtime/cds-services/adapter/rest/utils/parse-url.js +0 -250
  325. package/libx/_runtime/cds-services/adapter/rest/utils/result.js +0 -26
  326. package/libx/_runtime/cds-services/services/utils/handlerUtils.js +0 -200
  327. package/libx/_runtime/common/aspects/utils.js +0 -152
  328. package/libx/_runtime/common/toggles/handler.js +0 -21
  329. package/libx/_runtime/common/utils/extensibilityUtils.js +0 -18
  330. package/libx/_runtime/extensibility/mps/index.js +0 -5
  331. package/libx/_runtime/extensibility/mps/service.js +0 -111
  332. package/libx/_runtime/extensibility/mps/tar.js +0 -42
  333. package/libx/_runtime/extensibility/mps/utils.js +0 -11
  334. package/libx/_runtime/extensibility/uiflex/index.js +0 -54
  335. package/libx/_runtime/extensibility/uiflex/service.js +0 -276
  336. package/libx/_runtime/messaging/common-utils/naming-conventions.js +0 -20
  337. package/libx/_runtime/remote/utils/client-types.d.ts +0 -7
  338. package/libx/gql/GraphQLAdapter.js +0 -33
  339. package/libx/gql/constants/adapter.js +0 -69
  340. package/libx/gql/constants/cds.js +0 -18
  341. package/libx/gql/constants/graphql.js +0 -33
  342. package/libx/gql/readme.md +0 -1
  343. package/libx/gql/resolvers/crud/create.js +0 -20
  344. package/libx/gql/resolvers/crud/delete.js +0 -29
  345. package/libx/gql/resolvers/crud/index.js +0 -6
  346. package/libx/gql/resolvers/crud/read.js +0 -30
  347. package/libx/gql/resolvers/crud/update.js +0 -42
  348. package/libx/gql/resolvers/crud/utils/index.js +0 -36
  349. package/libx/gql/resolvers/field.js +0 -5
  350. package/libx/gql/resolvers/index.js +0 -7
  351. package/libx/gql/resolvers/mutation.js +0 -23
  352. package/libx/gql/resolvers/parse/ast/enrich.js +0 -52
  353. package/libx/gql/resolvers/parse/ast/fragment.js +0 -11
  354. package/libx/gql/resolvers/parse/ast/fromObject.js +0 -39
  355. package/libx/gql/resolvers/parse/ast/index.js +0 -3
  356. package/libx/gql/resolvers/parse/ast/meta.js +0 -4
  357. package/libx/gql/resolvers/parse/ast/variable.js +0 -7
  358. package/libx/gql/resolvers/parse/ast2cqn/columns.js +0 -44
  359. package/libx/gql/resolvers/parse/ast2cqn/entries.js +0 -31
  360. package/libx/gql/resolvers/parse/ast2cqn/index.js +0 -8
  361. package/libx/gql/resolvers/parse/ast2cqn/limit.js +0 -6
  362. package/libx/gql/resolvers/parse/ast2cqn/orderBy.js +0 -24
  363. package/libx/gql/resolvers/parse/ast2cqn/utils/index.js +0 -3
  364. package/libx/gql/resolvers/parse/ast2cqn/where.js +0 -70
  365. package/libx/gql/resolvers/parse/utils/index.js +0 -8
  366. package/libx/gql/resolvers/query.js +0 -13
  367. package/libx/gql/resolvers/root.js +0 -34
  368. package/libx/gql/schema/generate.js +0 -18
  369. package/libx/gql/schema/index.js +0 -5
  370. package/libx/gql/schema/mutation.js +0 -76
  371. package/libx/gql/schema/query.js +0 -108
  372. package/libx/gql/schema/typeDefMap.js +0 -45
  373. package/libx/gql/schema/utils/index.js +0 -54
  374. package/libx/gql/utils/index.js +0 -12
  375. package/libx/rest/middleware/auth.js +0 -20
  376. package/libx/rest/middleware/content.js +0 -19
  377. package/srv/flex.cds +0 -21
  378. package/srv/flex.js +0 -1
  379. package/srv/mps.cds +0 -23
  380. package/srv/mps.js +0 -1
  381. package/srv/outbox.js +0 -0
@@ -1,8 +1,8 @@
1
1
  const path = require('path')
2
- const { fs } = require('@sap/cds-foss')
2
+ const fs = require('fs').promises
3
3
 
4
4
  const { BUILD_OPTION_OUTPUT_MODE, OUTPUT_MODE_DEFAULT, OUTPUT_MODE_RESULT_ONLY, SEVERITY_INFO, SEVERITY_WARNING, SEVERITY_ERROR, OVERRIDE_METHOD_MSG } = require('./constants')
5
- const { hasOptionValue, getProperty, relativePaths, isAbsolutePath, BuildMessage } = require('./util')
5
+ const { hasOptionValue, getProperty, relativePaths, BuildMessage } = require('./util')
6
6
 
7
7
  /**
8
8
  * The build task handler creates the build output for a dedicated build task. It is uniquely identified
@@ -113,46 +113,50 @@ class BuildTaskHandler {
113
113
  return {
114
114
  to: async (dest) => {
115
115
  if (!this._hasBuildOption(BUILD_OPTION_OUTPUT_MODE, OUTPUT_MODE_RESULT_ONLY)) {
116
- if (!isAbsolutePath(dest)) {
116
+ if (!path.isAbsolute(dest)) {
117
117
  // relative to build task's destination path
118
118
  dest = path.resolve(this.task.dest, dest)
119
119
  }
120
120
  this._pushFile(dest)
121
121
  if (this._hasBuildOption(BUILD_OPTION_OUTPUT_MODE, OUTPUT_MODE_DEFAULT)) {
122
- await fs.outputFile(dest, typeof data === "object" ? JSON.stringify(data, null, 2) : data)
122
+ await fs.mkdir(path.dirname(dest), { recursive: true })
123
+ await fs.writeFile(dest, typeof data === "object" && !Buffer.isBuffer(data) ? JSON.stringify(data, null, 2) : data)
123
124
  }
124
125
  }
125
126
  }
126
127
  }
127
128
  }
128
129
 
130
+ // TODO only works with files due to fs.copyFile, check usages
129
131
  /**
130
132
  * Copy a file or directory if the build task option 'outputMode' does not have the value 'resultOnly'.
131
133
  * The directory can have contents.
132
134
  * <p>
133
135
  * Note: The file name is stored in the list of files written by this build task handler.
134
136
  * </p>
135
- * @param {string} source The absolute or relative source path of the file or directory to copy.
137
+ * @param {string} src The absolute or relative source path of the file or directory to copy.
136
138
  * Relative paths will be resolved to this task's source path.
137
139
  * @param {string} dest The absolute or relative target path. Relative paths will be resolved to this task's destination path.
138
140
  *
139
141
  */
140
- copy(source) {
142
+ copy(src) {
141
143
  return {
142
144
  to: async (dest) => {
143
145
  if (!this._hasBuildOption(BUILD_OPTION_OUTPUT_MODE, OUTPUT_MODE_RESULT_ONLY)) {
144
- if (!isAbsolutePath(source)) {
146
+ if (!path.isAbsolute(src)) {
145
147
  // relative to build task's source path
146
- source = path.resolve(this.task.src, source)
148
+ src = path.resolve(this.task.src, src)
147
149
  }
148
- if (!isAbsolutePath(dest)) {
150
+ if (!path.isAbsolute(dest)) {
149
151
  // relative to build task's destination path
150
152
  dest = path.resolve(this.task.dest, dest)
151
153
  }
152
154
  this._pushFile(dest)
153
155
  if (this._hasBuildOption(BUILD_OPTION_OUTPUT_MODE, OUTPUT_MODE_DEFAULT)) {
154
- // symlinks are not dereferenced
155
- await fs.copy(source, dest)
156
+ if (fs.cp) { // Node.js >= 16.7
157
+ return fs.cp(src, dest, { recursive: true })
158
+ }
159
+ return this._copy(src, dest)
156
160
  }
157
161
  return dest
158
162
  }
@@ -215,6 +219,7 @@ class BuildTaskHandler {
215
219
  _hasBuildOption(qualifiedName, value) {
216
220
  return hasOptionValue(this._getBuildOption(qualifiedName), value)
217
221
  }
222
+
218
223
  // Returns the value of the given build option defined for this build task.
219
224
  _getBuildOption(qualifiedName) {
220
225
  // build task options overwriting other settings
@@ -228,5 +233,16 @@ class BuildTaskHandler {
228
233
  }
229
234
  return getProperty(this._buildOptions, qualifiedName)
230
235
  }
236
+
237
+ // Asynchronously copies the entire content from src to dest.
238
+ async _copy(src, dest) {
239
+ if ((await fs.stat(src)).isDirectory()) {
240
+ const entries = await fs.readdir(src)
241
+ return Promise.all(entries.map(async each => this._copy(path.join(src, each), path.join(dest, each))))
242
+ } else {
243
+ await fs.mkdir(path.dirname(dest), { recursive: true })
244
+ return fs.copyFile(src, dest)
245
+ }
246
+ }
231
247
  }
232
248
  module.exports = BuildTaskHandler
@@ -2,7 +2,7 @@
2
2
  module.exports = class BuildTaskProvider {
3
3
  constructor() {
4
4
  //injected by framework
5
- this._plugin = null
5
+ this._plugin = null
6
6
  }
7
7
  canHandleTask(task) {
8
8
  // return this._plugin.provides.includes(task.for || task.use && this._getTaskId(task.use))
@@ -10,9 +10,7 @@ module.exports = class BuildTaskProvider {
10
10
  loadHandler(task) {
11
11
  // return module.require(`${this._plugin.path}/${task.for || this._getTaskId(task.use)}`)
12
12
  }
13
- async lookupTasks() {
14
- return []
15
- }
13
+ async lookupTasks(tasks) { }
16
14
  async applyTaskDefaults(task) {
17
15
  // task.for = task.for || this._getTaskId(task.use)
18
16
  }
@@ -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 _cds = require('./cds')
4
4
  const { OUTPUT_MODE_DEFAULT, LOG_MODULE_NAMES } = require("./constants")
@@ -33,7 +33,7 @@ class BuildTaskProviderFactory {
33
33
  }
34
34
 
35
35
  async applyTaskDefaults(tasks) {
36
- await Promise.all(tasks.map(async task => {
36
+ return Promise.all(tasks.map(async task => {
37
37
  if (!task.for && !task.use) {
38
38
  throw new Error("Invalid build task definition - property 'for' and property 'use' missing")
39
39
  }
@@ -55,19 +55,14 @@ class BuildTaskProviderFactory {
55
55
  }))
56
56
  }
57
57
 
58
- async lookupTasks() {
59
- this.logger.debug("determining CDS build tasks from CDS configuration - applying defaults")
60
- let tasks = []
58
+ async lookupTasks(tasks=[]) {
61
59
  await Promise.all(this.providers.map(async (provider) => {
62
- let pluginTasks = await this._lookupTasks(provider)
63
- if (!Array.isArray(pluginTasks)) {
64
- this.logger.error(`Build task provider ${provider.constructor.name} returned invalid type, array required.\nReceived ${JSON.stringify(pluginTasks)}`)
65
- }
60
+ const snapShot = tasks
61
+ await this._lookupTasks(provider, tasks)
66
62
  // apply defaults
67
- await this._applyTaskDefaults(provider, pluginTasks)
68
-
69
- tasks = tasks.concat(pluginTasks)
70
- this.logger._debug && this.logger.debug(`Build task provider ${provider.constructor.name} returned build tasks ${JSON.stringify(pluginTasks)}`)
63
+ const newTasks = tasks.filter(task => !snapShot.includes(task))
64
+ await this._applyTaskDefaults(provider, newTasks)
65
+ this.logger._debug && this.logger.debug(`Build task provider ${provider.constructor.name} returned build tasks ${JSON.stringify(newTasks)}`)
71
66
  }))
72
67
  return tasks
73
68
  }
@@ -94,7 +89,7 @@ class BuildTaskProviderFactory {
94
89
 
95
90
  /**
96
91
  * Loads the build task handler implementation for the given build task.
97
- * 'for' defines an alias for built-in handlers like 'hana', 'java-cf', 'node-cf', 'fiori' or 'mtx'.
92
+ * 'for' defines an alias for built-in handlers like 'hana', 'java', 'node', 'fiori' or 'mtx'.
98
93
  * 'use' defines the fully qualified module name of external build task handler implemenations.
99
94
  * @param {object} task
100
95
  */
@@ -144,9 +139,9 @@ class BuildTaskProviderFactory {
144
139
  return resolvedTask
145
140
  }
146
141
 
147
- async _lookupTasks(provider) {
142
+ async _lookupTasks(provider, tasks) {
148
143
  try {
149
- return provider.lookupTasks(this.buildOptions)
144
+ await provider.lookupTasks(tasks, this.buildOptions)
150
145
  } catch (e) {
151
146
  this.logger.error(`Build task provider ${provider.constructor.name} returned error:\n` + e)
152
147
  throw e
@@ -6,20 +6,21 @@ exports.OUTPUT_MODE_RESULT_ONLY = "resultOnly"
6
6
 
7
7
  exports.BUILD_TASK_NPM_SCOPE = "@sap"
8
8
  exports.BUILD_TASK_PREFIX = exports.BUILD_TASK_NPM_SCOPE + "/cds/build"
9
- exports.BUILD_TASK_JAVA = "java-cf"
10
- exports.BUILD_TASK_NODE = "node-cf"
9
+ exports.BUILD_TASK_JAVA = "java"
10
+ exports.BUILD_TASK_JAVA_CF = "java-cf"
11
+ exports.BUILD_TASK_NODEJS = "nodejs"
12
+ exports.BUILD_TASK_NODE_CF = "node-cf"
11
13
  exports.BUILD_TASK_HANA = "hana"
12
14
  exports.BUILD_TASK_FIORI = "fiori"
13
15
  exports.BUILD_TASK_MTX = "mtx"
14
- exports.BUILD_TASKS = [this.BUILD_TASK_JAVA, this.BUILD_TASK_NODE, this.BUILD_TASK_HANA, this.BUILD_TASK_FIORI, this.BUILD_TASK_MTX]
16
+ exports.BUILD_TASK_MTX_SIDECAR = "mtx-sidecar"
17
+ exports.BUILD_TASKS = [this.BUILD_TASK_JAVA, this.BUILD_TASK_JAVA_CF, this.BUILD_TASK_NODEJS, this.BUILD_TASK_NODE_CF, this.BUILD_TASK_HANA, this.BUILD_TASK_FIORI, this.BUILD_TASK_MTX, this.BUILD_TASK_MTX_SIDECAR]
15
18
 
16
19
  exports.ODATA_VERSION = "odata.version"
17
20
  exports.ODATA_VERSION_V2 = "v2"
18
21
  exports.ODATA_VERSION_V4 = "v4"
19
22
 
20
- exports.BUILD_MODE_INPLACE = "inplace"
21
23
  exports.BUILD_NODEJS_EDMX_GENERAION = "build.nodejs.edmxgeneration" // WebIDE Fullstack
22
-
23
24
  exports.EDMX_GENERATION = "edmxGeneration"
24
25
 
25
26
  exports.SKIP_MANIFEST_GENERATION = "skipManifestGeneration"
@@ -31,11 +32,18 @@ exports.CONTENT_DEFAULT_CSN = "contentDefaultCsn" // create default CS
31
32
  exports.CONTENT_EDMX = "contentEdmx" // create EDMX for required languages
32
33
  exports.CONTENT_MANIFEST = "contentManifest" // create manifest.yml and .cfignore files
33
34
  exports.CONTENT_PACKAGE_JSON = "contentPackageJson" // create package.json file if not existing, or modify existing package.json
34
- exports.CONTENT_PACKAGELOCK_JSON = "contentPackageLockJson" // copy package-lock.json file if existing
35
+ exports.CONTENT_PACKAGELOCK_JSON = "contentPackageLockJson" // copy package-lock.json file if existing into deployment folder
35
36
  exports.CONTENT_HDBTABLEDATA = "contentHdbtabledata" // create .hdbtabledata files for .csv files if not existing
37
+ exports.CONTENT_NPMRC = "contentNpmrc" // copy .npmrc file if existing into deployment folder
38
+ exports.CONTENT_CDSRC_JSON = "contentCdsrcJson" // copy .cdsrc.json file if existing into deployment folder
39
+ exports.CONTENT_NODE_MODULES = "contentNodeModules" // copy node_modules folder if existing into deployment folder
40
+ exports.CONTENT_ENV = "contentEnv" // copy .env file if existing into deployment folder
41
+ exports.CONTENT_DEFAULT_ENV_JSON = "contentDefaultEnvJson" // copy default-env.json file if existing into deployment folder
42
+ exports.CSV_FILE_DETECTION = "csvFileDetection" // detect CSV files based on CDS model location
36
43
 
37
44
  exports.FOLDER_GEN = "gen"
38
45
  exports.FILE_EXT_CDS = ".cds"
46
+ exports.MTX_SIDECAR_FOLDER = "mtx/sidecar" // default name of the mtx sidecar folder
39
47
 
40
48
  exports.CDS_CONFIG_PATH_SEP = "/"
41
49
  exports.SKIP_ASSERT_COMPILER_V2 = "skip-assert-compiler-v2"
@@ -1,9 +1,10 @@
1
1
  const {createReadStream, createWriteStream, readFile:rf} = require('fs')
2
2
  const readFile = require('util').promisify(rf)
3
3
  const {Readable} = require('stream')
4
+ const cds = require('../../lib')
4
5
 
5
6
  const SEPARATOR = /[,;\t]/
6
- module.exports = { parse: global.cds.parse.csv, readHeader, stripComments, serialize }
7
+ module.exports = { parse: cds.parse.csv, readHeader, stripComments, serialize }
7
8
 
8
9
 
9
10
  function serialize (rows, columns, bom='\ufeff') {
@@ -1,11 +1,10 @@
1
1
  const path = require('path')
2
- const { fs } = require('@sap/cds-foss')
2
+ const fs = require('fs')
3
3
  const BuildTaskEngine = require('./buildTaskEngine')
4
4
  const BuildTaskFactory = require('./buildTaskFactory')
5
5
  const BuildTaskHandler = require('./buildTaskHandler')
6
6
  const { LOG_MODULE_NAMES } = require('./constants')
7
7
  const { BuildError } = require('./util')
8
- const { BUILD_MODE_INPLACE } = require('./constants')
9
8
 
10
9
  module.exports = Object.assign(build,
11
10
  { build, BuildTaskFactory, BuildTaskEngine, BuildTaskHandler, BuildError }
@@ -15,34 +14,29 @@ module.exports = Object.assign(build,
15
14
  * New modular build.
16
15
  *
17
16
  * @param {object} options - commmand options as defined by build command.
18
- * @param {object} _env - for testing purposes only, will be removed.
19
17
  */
20
- async function build(options = {}, _env = null /* for unit tests only: */) {
18
+ async function build(options = {}) {
21
19
  const projectPath = path.resolve(options.project || '.')
22
20
 
23
21
  if (!fs.lstatSync(projectPath).isDirectory()) {
24
22
  return Promise.reject(`Project [${projectPath}] does not exist`)
25
23
  }
26
24
 
27
- const cds = require('./cds').in(projectPath)
28
- const logger = options.logger || cds.log(LOG_MODULE_NAMES)
29
-
30
- if (_env) {
31
- // REVISIT: please avoid using internal APIs
32
- cds.env = cds.env._merge_with(_env)
25
+ const cds = require('./cds')
26
+ if (projectPath !== process.cwd()) {
27
+ const env = cds.env.for('cds', projectPath);
28
+ cds.env = env
29
+ cds.root = projectPath
33
30
  }
31
+ const logger = options.logger || cds.log(LOG_MODULE_NAMES)
34
32
 
35
- const buildOptions = _mergeOptions({ root: projectPath }, options)
33
+ const buildOptions = _mergeCliOptions({ root: projectPath }, options)
36
34
 
37
- // Webide Fullstack compatibility mode
38
- if (cds.env.build.mode === BUILD_MODE_INPLACE) {
39
- cds.env.build.target = "."
40
- }
41
- let tasks = await new BuildTaskFactory(logger, cds).getTasks(buildOptions)
42
- return new BuildTaskEngine(logger, cds).processTasks(tasks, buildOptions)
35
+ let tasks = await new BuildTaskFactory(logger).getTasks(buildOptions)
36
+ return new BuildTaskEngine(logger).processTasks(tasks, buildOptions)
43
37
  }
44
38
 
45
- function _mergeOptions(buildOptions, options) {
39
+ function _mergeCliOptions(buildOptions, options) {
46
40
  buildOptions["log-level"] = options["log-level"]
47
41
  buildOptions.cli = options.cli
48
42
  buildOptions.cmdOptions = options
@@ -1,18 +1,8 @@
1
1
  const path = require('path')
2
- const BuildTaskHandlerInternal = require('./buildTaskHandlerInternal')
2
+ const BuildTaskHandlerFeatureToggles = require('./buildTaskHandlerFeatureToggles')
3
3
  const { BUILD_OPTION_OUTPUT_MODE, OUTPUT_MODE_RESULT_ONLY } = require('../constants')
4
4
 
5
- class BuildTaskHandlerEdmx extends BuildTaskHandlerInternal {
6
- init() {
7
- this._result = {
8
- dest: this.task.dest,
9
- csn: {},
10
- edmx: new Map(),
11
- languages: new Set(),
12
- services: new Set(),
13
- languageBundles: {}
14
- }
15
- }
5
+ class BuildTaskHandlerEdmx extends BuildTaskHandlerFeatureToggles {
16
6
  async compileToEdmx(model, edmxDest, compileOptions = {}) { // NOSONAR
17
7
  const promises = []
18
8
  const services = this.cds.reflect(model).services
@@ -55,38 +45,12 @@ class BuildTaskHandlerEdmx extends BuildTaskHandlerInternal {
55
45
  return Promise.all(promises)
56
46
  }
57
47
 
58
- async compileToJson(model, csnDest, saveResult = true) {
59
- // This will als add a @source prop containing the relative path to the origin .cds source file
60
- // and a parsed _where clause for @restrict.{grant,where} annotations.
61
- // The @source annotation is required for correct custom handler resolution if no @impl annotation has been defined as
62
- // custom service handler implementations are relative to the origin .cds source files.
63
- // For staging builds (task.src !== task.dest) the csn.json file that is served at runtime is copied into a corresponding srv subfolder.
64
- // As a consequence the src folder name has to be included in the @source file name while for inplace builds (task.src === task.dest) this is not the case.
65
- // This ensures that the paths are relative to the cwd when executing cds run.
66
- const jsonOptions = {
67
- cwd: this.buildOptions.root,
68
- src: this.task.src === this.task.dest ? this.task.src : this.buildOptions.root
69
- }
70
- const csnStr = this.cds.compile.to.json(model, jsonOptions)
71
- const csn = JSON.parse(csnStr)
72
- if (saveResult) {
73
- this._result.csn = csn
74
- this._result.csn.meta = model.meta
75
- }
76
-
77
- // csnDest might be null
78
- if (csnDest && !this.hasBuildOption(BUILD_OPTION_OUTPUT_MODE, OUTPUT_MODE_RESULT_ONLY)) {
79
- await this.write(csnStr).to(path.join(csnDest, 'csn.json'))
80
- }
81
- return csn
82
- }
83
-
84
48
  /**
85
49
  * Collect and write language bundles into a single i18n.json file.
86
50
  * @param {Object} model
87
51
  * @param {string} bundleDest
88
52
  */
89
- async collectLanguageBundles(model, bundleDest, saveResult = true) {
53
+ async collectLanguageBundles(model, bundleDest, saveResult = true) {
90
54
  // collect effective i18n properties...
91
55
  let bundles = {}
92
56
  const bundleGenerator = this.cds.localize.bundles4(model)
@@ -0,0 +1,149 @@
1
+ const fs = require('fs')
2
+ const path = require('path')
3
+ const { BUILD_OPTION_OUTPUT_MODE, OUTPUT_MODE_RESULT_ONLY } = require('../constants')
4
+ const BuildTaskHandlerInternal = require('./buildTaskHandlerInternal')
5
+
6
+ class FeatureToggleBuilder extends BuildTaskHandlerInternal {
7
+ init() {
8
+ this._result = {
9
+ dest: this.task.dest,
10
+ csn: {},
11
+ edmx: new Map(),
12
+ languages: new Set(),
13
+ services: new Set(),
14
+ languageBundles: {}
15
+ }
16
+ }
17
+
18
+ get ftsName() {
19
+ return path.dirname(this.env.features.folders || 'fts/*')
20
+ }
21
+
22
+ async compileAll(csn, destBase, destFts) {
23
+ const sources = await this._resolveSourcePaths(csn)
24
+ const dictionary = { base: null, features: null }
25
+
26
+ if (sources.features) {
27
+ // create base model as the given CSN is containing all features
28
+ dictionary.base = await this.cds.load(sources.base, this.options())
29
+ } else {
30
+ // CSN already represents the base model as no features exist
31
+ dictionary.base = csn
32
+ }
33
+ // preserve @location as @source properties
34
+ await this.compileToJson(dictionary.base, destBase)
35
+
36
+ if (sources.features) {
37
+ dictionary.features = await this._compileFeatures(sources.features, destBase, destFts)
38
+ }
39
+ return { dictionary, sources }
40
+ }
41
+
42
+ async collectAllLanguageBundles(dictionary, paths, destBase, destFts) {
43
+ // create language bundle for base model
44
+ await this.collectLanguageBundles(dictionary.base, destBase)
45
+ if (dictionary.features) {
46
+ // create language bundles for all features
47
+ for (const ftName in dictionary.features) {
48
+ // attach the sources information for i18n location reference
49
+ dictionary.features[ftName]['$sources'] = paths.features[ftName]
50
+ await this.collectLanguageBundles(dictionary.features[ftName], path.join(destFts, this.ftsName, ftName), false)
51
+ }
52
+ }
53
+ }
54
+
55
+ async _resolveSourcePaths(csn) {
56
+ const regex = new RegExp(path.resolve(this.buildOptions.root, this.ftsName).replace(/\\/g, '\\\\') + '[/|\\\\](?<ftName>[^/|\\\\]*)')
57
+ let paths = { base: [] }
58
+
59
+ // add ROOT source file paths for the base model
60
+ paths.base = this._resolveModel().reduce((acc, file) => {
61
+ const match = file.match(regex)
62
+ if (!match) {
63
+ acc.push(file)
64
+ }
65
+ return acc
66
+ }, [])
67
+
68
+ // keep existing behaviour and return paths returned by cds.resolve if features are not supported by this project
69
+ if (!fs.existsSync(path.join(this.buildOptions.root, this.ftsName))) {
70
+ return paths
71
+ }
72
+
73
+ // add source file paths for the features
74
+ paths.features = csn['$sources'].reduce((acc, file) => {
75
+ const match = file.match(regex)
76
+ if (match) {
77
+ const { ftName } = match.groups
78
+ //feature
79
+ if (!acc[ftName]) {
80
+ acc[ftName] = []
81
+ }
82
+ acc[ftName].push(file)
83
+ }
84
+ return acc
85
+ }, {})
86
+
87
+ return paths
88
+ }
89
+
90
+ async compileToJson(model, csnDest, saveResult = true) {
91
+ // This will als add a @source prop containing the relative path to the origin .cds source file
92
+ // and a parsed _where clause for @restrict.{grant,where} annotations.
93
+ // The @source annotation is required for correct custom handler resolution if no @impl annotation has been defined as
94
+ // custom service handler implementations are relative to the origin .cds source files.
95
+ // For staging builds (task.src !== task.dest) the csn.json file that is served at runtime is copied into a corresponding srv subfolder.
96
+ // As a consequence the src folder name has to be included in the @source file name while for inplace builds (task.src === task.dest) this is not the case.
97
+ // This ensures that the paths are relative to the cwd when executing cds run.
98
+ const jsonOptions = {
99
+ cwd: this.buildOptions.root,
100
+ src: this.task.src === this.task.dest ? this.task.src : this.buildOptions.root
101
+ }
102
+ const csnStr = this.cds.compile.to.json(model, jsonOptions)
103
+ const csn = JSON.parse(csnStr)
104
+ if (saveResult) {
105
+ this._result.csn = csn
106
+ this._result.csn.meta = model.meta
107
+ }
108
+
109
+ // csnDest might be null
110
+ if (csnDest && !this.hasBuildOption(BUILD_OPTION_OUTPUT_MODE, OUTPUT_MODE_RESULT_ONLY)) {
111
+ await this.write(csnStr).to(path.join(csnDest, 'csn.json'))
112
+ }
113
+ return csn
114
+ }
115
+
116
+ async _compileFeatures(ftsPaths, destBase, destFts) {
117
+ if (!ftsPaths) {
118
+ return
119
+ }
120
+ const features = {}
121
+ const options = { ...this.options(), flavor: 'parsed' }
122
+ const srvFolder = path.relative(destFts, destBase)
123
+
124
+ // create feature models
125
+ for (const ftName in ftsPaths) {
126
+ const ftCsn = await this.cds.load(ftsPaths[ftName], options)
127
+
128
+ // replace require paths by base model path to ensure precedence of feature annos
129
+ // see https://pages.github.tools.sap/cap/docs/cds/compiler-messages#anno-duplicate-unrelated-layer
130
+ ftCsn.requires = [path.join('../..', srvFolder, 'csn.json')]
131
+
132
+ const ftPath = path.join(destFts, this.ftsName, ftName)
133
+ await this.compileToJson(ftCsn, ftPath, false)
134
+ await this._validateFeature(ftPath)
135
+ features[ftName] = ftCsn
136
+ }
137
+ return features
138
+ }
139
+
140
+ async _validateFeature(ftPath) {
141
+ // features must not have other than base model dependencies, cross feature dependencies are not supported
142
+ // do not pass options.messages in order to avoid duplicate compiler messages
143
+ return this.cds.load([ftPath])
144
+ // version 2.13.9 of compileSources does not read the requires definition of parsed CSNs
145
+ // require('@sap/cds-compiler').compileSources({ '../..csn.json': baseCsn, 'feature.csn': ftCsn }, this.options())
146
+ }
147
+ }
148
+
149
+ module.exports = FeatureToggleBuilder
@@ -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 BuildTaskHandler = require('../buildTaskHandler')
4
4
  const { hasOptionValue } = require('../util')
@@ -47,7 +47,7 @@ class BuildTaskHandlerInternal extends BuildTaskHandler {
47
47
  // the build results have already been deleted by the BuildTaskEngine if the build.target !== '.'
48
48
  // make sure that src is not a subfolder of dest
49
49
  if (this._buildOptions.root === this._buildOptions.target && this.task.src !== this.task.dest && !this._isSubDirectory(this.task.dest, this.task.src)) {
50
- await fs.remove(this.task.dest)
50
+ await fs.promises.rm(this.task.dest, {force: true, recursive: true})
51
51
  }
52
52
  }
53
53
 
@@ -153,7 +153,6 @@ class BuildTaskHandlerInternal extends BuildTaskHandler {
153
153
  // - are contained in this modules 'dest' folder
154
154
  // - are contained in some generation folder
155
155
  // - do NOT fullfill additional specific filter criteria
156
- // NOTE: there is no specific handling for content that is part of the 'node_modules' folder as it might be required later on, e.g. reuse model content
157
156
  return this._commonStagingBuildFilter(src, destDir) && (!customFilter || customFilter.call(this, src))
158
157
  })
159
158
  return Promise.all(