@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,6 +1,6 @@
1
1
  const cp = require('child_process');
2
2
  const path = require('path');
3
- const { fse } = require('@sap/cds-foss');
3
+ const fs = require('fs').promises;
4
4
  const util = require('util');
5
5
 
6
6
  const cds = require('../../../lib');
@@ -40,12 +40,14 @@ class GitUtil {
40
40
  # added by cds deploy
41
41
  ${file}
42
42
  `;
43
- await fse.outputFile(gitIgnorePath, gitignore, 'utf8');
43
+
44
+ await fs.mkdir(path.dirname(gitIgnorePath), { recursive: true });
45
+ await fs.writeFile(gitIgnorePath, gitignore, 'utf8');
44
46
  }
45
47
 
46
48
  async readFileSafely(file) {
47
49
  try {
48
- return await fse.readFile(file, 'utf8');
50
+ return await fs.readFile(file, 'utf8');
49
51
  } catch (err) {
50
52
  return '';
51
53
  }
@@ -3,7 +3,7 @@ const os = require('os');
3
3
  const path = require('path');
4
4
  const util = require('util');
5
5
 
6
- const { fse } = require('@sap/cds-foss');
6
+ const fs = require('fs').promises;
7
7
 
8
8
  const { BuildTaskEngine, BuildTaskFactory } = require('../../build');
9
9
  const buildConstants = require('../../build/constants');
@@ -14,7 +14,7 @@ const LOG = cds.log ? cds.log('deploy') : console;
14
14
  const cfUtil = require('./cfUtil');
15
15
  const hdiDeployUtil = require('./hdiDeployUtil');
16
16
  const gitUtil = require('./gitUtil');
17
- const mtaUtil = require('../../build/mtaUtil');
17
+ const mtaUtil = require('./mtaUtil');
18
18
 
19
19
  const { bold, info } = require('../../utils/term');
20
20
 
@@ -57,11 +57,11 @@ class HanaDeployer {
57
57
 
58
58
  if (undeployWhitelist) {
59
59
  this.logger.log('Writing undeploy.json');
60
- await fse.writeJSON(path.join(currentModelFolder, 'undeploy.json'), undeployWhitelist);
60
+ await fs.write(path.join(currentModelFolder, 'undeploy.json'), JSON.stringify(undeployWhitelist, null, 2));
61
61
  }
62
62
 
63
63
  if (vcapFile) {
64
- await fse.mkdirp(currentModelFolder);
64
+ await fs.mkdir(currentModelFolder, { recursive: true });
65
65
  } else {
66
66
  const { cfServiceInstanceName, cfServiceInstanceKeyName, serviceKey } =
67
67
  await this._getOrCreateCFService(projectPath, currentModelFolder, serviceName, tunnelAddress);
@@ -203,7 +203,7 @@ class HanaDeployer {
203
203
 
204
204
  async _loadVCAPServices(vcapFile) {
205
205
  try {
206
- const content = await fse.readJSON(vcapFile);
206
+ const content = JSON.parse(await fs.readFile(vcapFile));
207
207
  if (!content.VCAP_SERVICES) {
208
208
  throw new Error(`The vcap file ${vcapFile} does not contain a VCAP_SERVICES entry.`);
209
209
  }
@@ -221,7 +221,7 @@ class HanaDeployer {
221
221
  const defaultEnvJsonPath = path.join(currentFolder, 'default-env.json');
222
222
 
223
223
  try {
224
- defaultEnvJson = await fse.readJSON(defaultEnvJsonPath, UTF_8);
224
+ defaultEnvJson = JSON.parse(await fs.readFile(defaultEnvJsonPath, UTF_8));
225
225
  } catch (err) {
226
226
  // ignore any errors
227
227
  }
@@ -240,9 +240,8 @@ class HanaDeployer {
240
240
  }
241
241
 
242
242
  this.logger.log(`Writing ${defaultEnvJsonPath}`);
243
- await fse.outputJSON(defaultEnvJsonPath, defaultEnvJson, {
244
- spaces: 2
245
- });
243
+ await fs.mkdir(path.dirname(defaultEnvJsonPath), {recursive: true})
244
+ await fs.writeFile(defaultEnvJsonPath, JSON.stringify(defaultEnvJson, null, 2));
246
245
  }
247
246
  }
248
247
 
@@ -285,7 +284,7 @@ class HanaDeployer {
285
284
 
286
285
  async readFileSafely(file) {
287
286
  try {
288
- return await fse.readFile(file, 'utf8');
287
+ return await fs.readFile(file, 'utf8');
289
288
  } catch (err) {
290
289
  return '';
291
290
  }
@@ -1,13 +1,14 @@
1
- const cds = require('./cds')
2
- const { fs } = require('@sap/cds-foss')
1
+ const cds = require('../../../lib')
2
+ const fs = require('fs').promises
3
+ const {existsSync} = require('fs')
3
4
  const path = require('path')
4
- const { getProperty } = require('./util')
5
5
 
6
6
  const HDI_CONTAINER_TYPES = ['com.sap.xs.hdi-container']
7
7
  const UTF_8 = 'utf-8'
8
8
  const MTA_YAML = 'mta.yaml'
9
+ const LOG = cds.log ? cds.log('deploy') : console;
9
10
 
10
- async function getHanaDbModuleDescriptor(projectPath, moduleName, logger) {
11
+ async function getHanaDbModuleDescriptor(projectPath, moduleName, logger = LOG) {
11
12
  // mta might be null if mta.yaml does not exist
12
13
  const mta = await _getMta(projectPath, logger)
13
14
  const projectInfo = await _getProjectInfo(projectPath, mta, logger)
@@ -22,7 +23,7 @@ async function getHanaDbModuleDescriptor(projectPath, moduleName, logger) {
22
23
  }
23
24
  }
24
25
 
25
- async function getServiceModuleDescriptor(projectPath, moduleName, moduleType, logger) {
26
+ async function getServiceModuleDescriptor(projectPath, moduleName, moduleType, logger = LOG) {
26
27
  // mta might be null if mta.yaml does not exist
27
28
  const mta = await _getMta(projectPath, logger)
28
29
  const projectInfo = await _getProjectInfo(projectPath, mta, logger)
@@ -48,9 +49,9 @@ async function _getProjectInfo(projectPath, mta, logger) {
48
49
  }
49
50
  // 2. use package.json data
50
51
  const packageJsonPath = path.join(projectPath, 'package.json')
51
- if (await fs.pathExists(packageJsonPath)) {
52
+ if (existsSync(packageJsonPath)) {
52
53
  try {
53
- const packageJson = await fs.readJSON(packageJsonPath, 'utf-8')
54
+ const packageJson = JSON.parse((await fs.readFile(packageJsonPath, 'utf-8')).toString())
54
55
  if (!details.description && packageJson.description) {
55
56
  details.description = packageJson.description
56
57
  }
@@ -100,7 +101,7 @@ async function _getMta(projectPath, logger) {
100
101
  // yaml.parse oesn't like null
101
102
  const mtaFilePath = path.join(projectPath, MTA_YAML)
102
103
 
103
- const existsMtaYaml = await fs.pathExists(mtaFilePath)
104
+ const existsMtaYaml = existsSync(mtaFilePath)
104
105
  if (!existsMtaYaml) {
105
106
  logger.debug('mta.yaml not existing')
106
107
  return null
@@ -115,7 +116,7 @@ async function _getMta(projectPath, logger) {
115
116
  function _getApplicationName(mta, moduleName, moduleType) {
116
117
  const module = _findModule(mta, moduleName, moduleType)
117
118
  if (module) {
118
- const appName = getProperty(module, 'parameters.app-name')
119
+ const appName = module.parameters && module.parameters['app-name']
119
120
  return appName ? appName : module.name
120
121
  }
121
122
  return null
package/bin/mtx/in-cds.js CHANGED
@@ -1,9 +1,21 @@
1
1
  const cds = require('../build/cds')
2
- if (cds.requires.multitenancy && !cds.env.features.streamlined_mtx) try {
3
- const mtx = module.exports = require ('@sap/cds-mtx')()
4
- mtx.inject (cds)
5
- cds.on('served', () => cds.emit('mtx'))
6
- } catch(e) {
7
- if (e.code === 'MODULE_NOT_FOUND') throw new Error('Error serving MTX APIs: @sap/cds-mtx is not installed')
8
- else throw e
2
+ const _is_streamlined_mtx = ()=>{
3
+ if (process.env.OLD_MTX) return false
4
+ try { return !!require.resolve('@sap/cds-mtxs/srv/deployment-service') }
5
+ catch {/* ignored */}
9
6
  }
7
+
8
+ if (!cds.requires.multitenancy || _is_streamlined_mtx()) module.exports = undefined
9
+ else try {
10
+ const mtx = module.exports = require ('@sap/cds-mtx')()
11
+ mtx.inject (cds)
12
+ cds.on('served', () => cds.emit('mtx'))
13
+ } catch(e) {
14
+ if (e.code === 'MODULE_NOT_FOUND') throw new Error('Error serving MTX APIs: @sap/cds-mtx is not installed')
15
+ else throw e
16
+ }
17
+
18
+ /*
19
+ cds.requires.multitenancy -- use this to check whether mt is enabled (old or new)
20
+ cds.mtx -- use this to check whether old(!) mtx is enabled
21
+ */
package/bin/serve.js CHANGED
@@ -124,15 +124,18 @@ module.exports = Object.assign ( serve, {
124
124
 
125
125
 
126
126
  const cds = require('../lib'), { exists, isfile, local, path } = cds.utils
127
- let log = console.log // provisional logger, see _prepare_logging
127
+
128
+ // provisional loggers, see _prepare_logging
129
+ let log = console.log
130
+ let debug = false
128
131
 
129
132
  /**
130
133
  * The main function which dispatches into the respective usage variants.
131
134
  * @param {string[]} all - project folder, model filenames, or service name
132
135
  */
133
136
  async function serve (all=[], o={}) { // NOSONAR
134
-
135
137
  // canonicalize options to ease subsequent tasks...
138
+ cds.options = o
136
139
  const [pms] = all // project folder, model filenames, or service name
137
140
  if (o.from) o.from = o.from.split(',')
138
141
  if (o.project||o.projects) { o.project = pms; o.service='all'; o.from='*' }
@@ -170,8 +173,19 @@ async function serve (all=[], o={}) { // NOSONAR
170
173
 
171
174
  }
172
175
 
176
+ // activate plugins
177
+ if (cds.env.plugins) for (let each of cds.env.plugins) {
178
+ if (typeof each === 'string') each = {impl:each}
179
+ let impl = each.impl
180
+ if (impl.startsWith('.')) impl = require.resolve(cds.root+'/'+impl)
181
+ log ('loading plugin:', {impl})
182
+ // TODO support ESM plugins. But see cap/cds/pull/1838#issuecomment-1177200 !
183
+ const plugin = require(impl)
184
+ if (plugin.activate) plugin.activate(each)
185
+ }
186
+
173
187
  // bootstrap server from project-local server.js or from @sap/cds/server.js
174
- const cds_server = _local_server_js() || cds.server
188
+ const cds_server = await _local_server_js() || cds.server
175
189
  const server = await cds_server(o)
176
190
 
177
191
  // return a promise which resolves to the created http server when listening
@@ -183,24 +197,36 @@ async function serve (all=[], o={}) { // NOSONAR
183
197
  }
184
198
  server.listening ? _started(server) : server.once('listening',_started)
185
199
  server.on ('error',_reject) // startup errors like EADDRINUSE
200
+ server.on ('close', ()=> shutdown()) // in case of server.close() was called, like in cds.test
201
+
202
+ let shutdownCalled = false
203
+ const shutdown = async sig => {
204
+ if (shutdownCalled) return
205
+ shutdownCalled = true
206
+ global.jest || cds.watched || console.log() // blank line makes the ^C look pretty in terminals
207
+ debug && debug(`${sig}, shutting down, calling ${cds.listeners('shutdown').length} listeners`)
208
+ await Promise.all(cds.listeners('shutdown').map((fn) => fn()))
209
+ if (process.env.NODE_ENV !== 'test' && !global.it) process.exit()
210
+ }
211
+
212
+ process.once('SIGTERM', shutdown)
213
+ process.once('SIGINT', shutdown)
214
+ process.once('SIGHUP', shutdown)
215
+ process.once('SIGUSR2', shutdown) // by nodemon
216
+ process.on('beforeExit', shutdown) //> when event loop empties
217
+ process.on('message', (msg) => { if (msg.close||msg.exit) shutdown() }) // by `cds watch` on Windows
186
218
 
187
- // graceful server shutdown
188
- const close = () => server.close()
189
- process.once('SIGTERM', close)
190
- process.once('SIGINT', close)
191
- process.once('SIGHUP', close)
192
- process.once('SIGUSR2', close) // by nodemon
193
219
  return server
194
220
  })
195
221
  }
196
222
 
197
-
198
- function _local_server_js() {
223
+ async function _local_server_js() {
199
224
  const _local = file => isfile(file) || isfile (path.join(cds.env.folders.srv,file))
200
225
  let server_js = process.env.CDS_TYPESCRIPT && _local('server.ts') || _local('server.js')
201
226
  if (server_js) {
202
- log && log ('Loading server from', { file: local(server_js) })
203
- const fn = require (server_js)
227
+ log ('Loading server from', { file: local(server_js) })
228
+ let fn = await _import(server_js)
229
+ if (fn && fn.default) fn = fn.default // default ESM export
204
230
  return typeof fn === 'function' ? fn : cds.server
205
231
  }
206
232
  }
@@ -210,7 +236,8 @@ function _prepare_logging () { // NOSONAR
210
236
  // change `log` function to cds.log
211
237
  const LOG = cds.log('serve', { prefix:'cds' })
212
238
  log = LOG._info && LOG.info
213
- if (!log) return
239
+ if (!log) return log = ()=>{}
240
+ debug = cds.debug('cli')
214
241
 
215
242
  const _timer = `[cds] - launched at ${new Date().toLocaleString()}, in`
216
243
  console.time (_timer)
@@ -229,8 +256,9 @@ function _prepare_logging () { // NOSONAR
229
256
 
230
257
  // print information about each provided service
231
258
  cds.on ('serving', (srv) => {
232
- const details = { at: srv.path }
233
- if (srv._source) details.impl = local(srv._source)
259
+ const details = {}
260
+ if (srv.path) details.path = srv.path
261
+ if (srv._source) details.impl = local( srv._source.startsWith('@sap') ? require.resolve(srv._source) : srv._source )
234
262
  log (`${srv.mocked ? 'mocking' : 'serving'} ${srv.name}`, details)
235
263
  })
236
264
 
@@ -239,7 +267,7 @@ function _prepare_logging () { // NOSONAR
239
267
  console.log ()
240
268
  log ('server listening on',{url})
241
269
  _timer && console.timeEnd (_timer)
242
- if (process.stdin.isTTY) log (`[ terminate with ^C ]\n`)
270
+ if (process.stdin.isTTY) log (`[ terminate with ^C ]`)
243
271
  })
244
272
  }
245
273
 
@@ -268,8 +296,8 @@ function _in_memory (o) {
268
296
  const {env} = cds, db = env.requires.db
269
297
  if (o['in-memory'] || o['in-memory?'] && !db) {
270
298
  env.add ({ requires: { db: {
271
- kind:'sqlite', ...env.requires.sqlite,
272
- credentials:{database:':memory:'}
299
+ kind:'sqlite', ...env.requires.kinds.sqlite,
300
+ credentials: db?.credentials?.url ? {url:':memory:'} : {database:':memory:'}
273
301
  }}})
274
302
  return true
275
303
  }
@@ -285,15 +313,22 @@ function _with_mocks (o) {
285
313
  cds.on ('loaded', model => cds.deploy.include_external_entities_in(model))
286
314
  const mocks = cds.env.features.test_mocks && isfile ('test/mocked.js')
287
315
  if (mocks) cds.once ('served', ()=> {
288
- log && log ('adding mock behaviours from', { file: local(mocks) })
316
+ log ('adding mock behaviours from', { file: local(mocks) })
289
317
  require(mocks)
290
318
  })
291
319
  return true
292
320
  }
293
321
  }
294
322
 
323
+ const { pathToFileURL } = require('url') // on Windows, must use a file: URL for ESM import
324
+ function _import(filePath) {
325
+ return typeof jest !== 'undefined'
326
+ ? require(filePath)
327
+ : import (pathToFileURL(filePath).href)
328
+ }
329
+
295
330
 
296
- const SECRETS = /(password)|(certificate)|(ca)|(clientsecret)/i // 'certificate' and 'ca' on HANA
331
+ const SECRETS = /(password)|(certificate)|(ca)|(secret)|(key)/i // 'certificate' and 'ca' on HANA
297
332
  /** mascades password-like strings, also reducing clutter in output */
298
333
  function _redacted(cred) {
299
334
  if (!cred) return cred
package/bin/utils/log.js CHANGED
@@ -1,41 +1,24 @@
1
- const { sortMessagesSeverityAware, deduplicateMessages } = require('@sap/cds-compiler')
2
-
3
1
  // sorts, filters, and writes compilation messages to console
4
2
  module.exports = (messages, options={}) => {
5
3
  const { format } = require('./term')
6
- const level = _effectiveLogLevel (options)
4
+ const logLevel = options && options['log-level'] || require('../../lib').env.log.levels.cli || ''
5
+ const levels = {
6
+ debug: { Error:4, undefined:4, Warning:3, Info:2, Debug:1 },
7
+ info: { Error:4, undefined:4, Warning:3, Info:2 },
8
+ warn: { Error:4, undefined:4, Warning:3 },
9
+ error: { Error:4, undefined:4 },
10
+ } [logLevel.toLowerCase()] || { Error:4, undefined:4, Warning:3 }
7
11
  const log = options.log || console.error
8
12
 
9
13
  if (!Array.isArray (messages)) messages = [messages]
10
- messages.forEach (m => { if (!m.severity) m.severity = 'Error' })
11
- messages = messages.filter (m => level.includes (m.severity))
12
-
13
- deduplicateMessages(messages)
14
- messages = sortMessagesSeverityAware (messages)
15
-
16
- for (let m of messages) {
14
+ for (let m of messages.filter (m => m.severity in levels)) {
17
15
  // show stack for resolution issues since there the requiring code location is in the stack
18
- const internalError = isInternalError(m)
19
- const withStack = options.withStack || m.code === 'MODULE_NOT_FOUND' || internalError
20
- const mf = format (m, m.severity, internalError, withStack)
16
+ // check for standard Error classes, but not Error itself
17
+ const internalError = m.name === 'EvalError' || m.name === 'InternalError' || m.name === 'RangeError'
18
+ || m.name === 'ReferenceError' || m.name === 'SyntaxError' || m.name === 'TypeError'
19
+ || m.name === 'URIError'
20
+ const mf = format (m, m.severity, internalError, true)
21
21
  log (mf)
22
22
  }
23
23
  }
24
-
25
- function _effectiveLogLevel (options) {
26
- const logLevel = options && options['log-level'] || require('../../lib').env.log.levels.cli
27
- if (/^debug$/i.test (logLevel)) return ['Error', 'Warning', 'Info', 'Debug']
28
- else if (/^info$/i.test (logLevel)) return ['Error', 'Warning', 'Info']
29
- else if (/^warn/i.test (logLevel)) return ['Error', 'Warning']
30
- else if (/^error/i.test (logLevel)) return ['Error']
31
- else return ['Error', 'Warning']
32
- }
33
-
34
- function isInternalError(e) {
35
- // check for standard Error classes, but not Error itself
36
- return e.name === 'EvalError' || e.name === 'InternalError' || e.name === 'RangeError'
37
- || e.name === 'ReferenceError' || e.name === 'SyntaxError' || e.name === 'TypeError'
38
- || e.name === 'URIError'
39
- }
40
-
41
24
  /* eslint no-console:off */
package/bin/version.js CHANGED
@@ -2,7 +2,7 @@
2
2
  const { dirname, join, resolve } = require ('path')
3
3
  const { cwd } = require('process')
4
4
  module.exports = Object.assign(list_versions, {
5
- flags: [ '--info', '--markdown', '--all', '--npm-list', '--npm-tree' ],
5
+ flags: [ '--info', '--markdown', '--all', '--npm-list', '--npm-tree', '--no-colors'],
6
6
  shortcuts: [ '-i', '-m','-a', '-ls', '-ll' ],
7
7
  info,
8
8
  help: `
@@ -41,15 +41,16 @@ function list_versions(args, options) { //NOSONAR
41
41
  console.log (cmd,'| grep', pattern)
42
42
  return require('child_process').exec(cmd, (e,stdout)=>{
43
43
  // if (e) console.error(e)
44
+ const replacement = (options['no-colors'] ? '$1 $2$3$4' : '\x1b[91m$1 \x1b[32m$2\x1b[0m\x1b[2m$3\x1b[32m$4\x1b[0m');
44
45
  for (let line of stdout.split(/\n/)) if (line.match(re)) console.log(
45
- line.replace(/(@sap[^@]*)@([\S]+)( -> [\S]+)?(deduped)?/,'\x1b[91m$1 \x1b[32m$2\x1b[0m\x1b[2m$3\x1b[32m$4\x1b[0m')
46
+ line.replace(/(@sap[^@]*)@([\S]+)( -> [\S]+)?(deduped)?/,replacement)
46
47
  )
47
48
  })
48
49
  }
49
50
  const versions = info (options)
50
51
  if (options.markdown) return _markdown (versions)
51
52
  if (options.info) return _markdown (versions)
52
- const mark = options.noColors ? s => s : require('./utils/term').info
53
+ const mark = options['no-colors'] ? s => s : require('./utils/term').info
53
54
  for (let each of Object.keys(versions).sort()) console.log(`${mark(each)}: ${versions[each]}`)
54
55
  }
55
56
 
package/common.cds CHANGED
@@ -1,5 +1,22 @@
1
+ /**
2
+ * Type for an association to Languages
3
+ *
4
+ * See https://cap.cloud.sap/docs/cds/common#type-language
5
+ */
1
6
  type Language : Association to sap.common.Languages;
7
+
8
+ /**
9
+ * Type for an association to Currencies
10
+ *
11
+ * See https://cap.cloud.sap/docs/cds/common#type-currency
12
+ */
2
13
  type Currency : Association to sap.common.Currencies;
14
+
15
+ /**
16
+ * Type for an association to Countries
17
+ *
18
+ * See https://cap.cloud.sap/docs/cds/common#type-country
19
+ */
3
20
  type Country : Association to sap.common.Countries;
4
21
 
5
22
  /**
@@ -7,22 +24,47 @@ type Country : Association to sap.common.Countries;
7
24
  * including built-in support for value lists in Fiori.
8
25
  */
9
26
  context sap.common {
10
- entity Languages : CodeList {
11
- key code : String(14) @(title : '{i18n>LanguageCode}');
27
+ /**
28
+ * Type for a language code
29
+ */
30
+ type Locale : String(14) @(title : '{i18n>LanguageCode}');
12
31
  //> length=14 is to accommodate values like these:
13
32
  // en_US_x_saptrc - (1Q) used as a technical SAP language code
14
33
  // en_US_x_sappsd - (2Q) used as a technical SAP language code
34
+
35
+ /**
36
+ * Code list for languages
37
+ *
38
+ * See https://cap.cloud.sap/docs/cds/common#entity-sapcommonlanguages
39
+ */
40
+ entity Languages : CodeList {
41
+ key code : Locale;
15
42
  }
16
43
 
44
+ /**
45
+ * Code list for countries
46
+ *
47
+ * See https://cap.cloud.sap/docs/cds/common#entity-sapcommoncountries
48
+ */
17
49
  entity Countries : CodeList {
18
50
  key code : String(3) @(title : '{i18n>CountryCode}');
19
51
  }
20
52
 
53
+ /**
54
+ * Code list for currencies
55
+ *
56
+ * See https://cap.cloud.sap/docs/cds/common#entity-sapcommoncurrencies
57
+ */
21
58
  entity Currencies : CodeList {
22
59
  key code : String(3) @(title : '{i18n>CurrencyCode}');
23
60
  symbol : String(5) @(title : '{i18n>CurrencySymbol}');
24
61
  }
25
62
 
63
+ /**
64
+ * Aspect for a code list with name and description
65
+ *
66
+ * See https://cap.cloud.sap/docs/cds/common#aspect-sapcommoncodelist
67
+ */
26
68
  aspect CodeList @(
27
69
  cds.autoexpose,
28
70
  cds.persistence.skip : 'if-unused'
@@ -33,15 +75,19 @@ context sap.common {
33
75
  }
34
76
 
35
77
 
36
- /*
37
- * Aspect for entities with canonical universal IDs.
78
+ /**
79
+ * Aspect for entities with canonical universal IDs
80
+ *
81
+ * See https://cap.cloud.sap/docs/cds/common#aspect-cuid
38
82
  */
39
83
  aspect cuid {
40
84
  key ID : UUID; //> automatically filled in
41
85
  }
42
86
 
43
- /*
44
- * Aspect to capture changes by user and name.
87
+ /**
88
+ * Aspect to capture changes by user and name
89
+ *
90
+ * See https://cap.cloud.sap/docs/cds/common#aspect-managed
45
91
  */
46
92
  aspect managed {
47
93
  createdAt : Timestamp @cds.on.insert : $now;
@@ -50,8 +96,10 @@ aspect managed {
50
96
  modifiedBy : User @cds.on.insert : $user @cds.on.update : $user;
51
97
  }
52
98
 
53
- /*
54
- * Aspects for entities with temporal data.
99
+ /**
100
+ * Aspect for entities with temporal data
101
+ *
102
+ * See https://cap.cloud.sap/docs/cds/common#aspect-temporal
55
103
  */
56
104
  aspect temporal {
57
105
  validFrom : Timestamp @cds.valid.from;
@@ -65,7 +113,7 @@ aspect temporal {
65
113
  type User : String(255);
66
114
 
67
115
 
68
- /*
116
+ /**
69
117
  * Aspects for extensible entities.
70
118
  */
71
119
  aspect extensible {
@@ -128,16 +176,13 @@ annotate managed with {
128
176
 
129
177
  //---------------------------------------------------------------------------
130
178
  // Temporary Workarounds...
131
-
132
- // REVISIT: Remove support for @odata.on... and #... with @sap/cds ^6
133
- // REVISIT: change @odata.on... to @cds.on...
134
179
  // REVISIT: @cds.on... should automatically result in @readonly @Core.Computed
135
180
 
136
181
  annotate managed with {
137
- modifiedAt @readonly @odata.on.update : #now;
138
- createdAt @readonly @odata.on.insert : #now;
139
- createdBy @readonly @odata.on.insert : #user;
140
- modifiedBy @readonly @odata.on.update : #user;
182
+ modifiedAt @readonly;
183
+ createdAt @readonly;
184
+ createdBy @readonly;
185
+ modifiedBy @readonly;
141
186
  }
142
187
 
143
188
  //---------------------------------------------------------------------------
@@ -1,8 +1,7 @@
1
1
  const cds = require ('../index')
2
2
  const {cdsc,odata,sql,features} = cds.env
3
3
  const constraints = {
4
- assertIntegrity: features.assert_integrity,
5
- assertIntegrityType: features.assert_integrity_type
4
+ assertIntegrity: features.assert_integrity
6
5
  }
7
6
  const compile = require ('@sap/cds-compiler')
8
7
  const _4cdsc = Symbol('_4cdsc')
@@ -66,6 +65,8 @@ const _options = {for: Object.assign (_options4, {
66
65
  },
67
66
 
68
67
  sql(o,_env) {
68
+ // REVISIT: compiler requires to only provide assertIntegrityType if defined
69
+ if(constraints.assertIntegrity) constraints.assertIntegrityType = features.assert_integrity_type
69
70
  return _options4 ({ ...constraints, ..._env||sql, ...o }, {
70
71
  sql_mapping : 'names', //> legacy
71
72
  sqlDialect : 'dialect', //> legacy
@@ -7,9 +7,6 @@ const _locales_4sql = {
7
7
 
8
8
  const { _texts_entries, _localized_entries } = env.cdsc.cv2 || {}
9
9
  const _been_here = Symbol('is _localized')
10
- const _conf = env.requires.db || env.requires.sql
11
- const _on_sqlite = _conf.kind === 'sqlite' || _conf.dialect === 'sqlite'
12
- //> FIXME: we reliably need to now if we'll be on sqlite even before the connect happened
13
10
 
14
11
 
15
12
 
@@ -46,6 +43,8 @@ function unfold_csn (m) { // NOSONAR
46
43
  DEBUG && DEBUG ('unfolding csn...')
47
44
  const pass2 = []
48
45
 
46
+ const _conf = env.requires.db || env.requires.sql || env.requires.kinds && env.requires.kinds.sql
47
+ const _on_sqlite = _conf.kind === 'sqlite' || _conf.dialect === 'sqlite'
49
48
  const _locales = _on_sqlite && _locales_4sql.sqlite
50
49
 
51
50
  // Pass 1 - add localized.<locale> entities and views
@@ -96,18 +95,20 @@ function unfold_csn (m) { // NOSONAR
96
95
  }
97
96
 
98
97
 
99
- const $localized = '$$localized', _is_localized = (d,_path={}) => {
100
- if (typeof d.own($localized) === 'boolean') return d.own($localized)
101
- if (!d.elements || d.name.endsWith('.texts')) return d.set($localized,false)
102
- // if (d.elements.texts && d.elements.texts.target === `${d.name}.texts`) return d.set($localized,true)
103
- for (let each in d.elements) {
104
- const e = d.elements [each]
105
- if (e.localized || e._target && !(_path && e._target.name in _path) && _is_localized(e._target,Object.assign(_path, { [d.name]:1 }))) {
106
- return d.set($localized,true)
98
+ const _is_localized = (
99
+ !env.features._ucsn_ ? d => d.own('$localized') // as set by compiler in compile.for.odata
100
+ : (d,_path={}) => d.own('$localized', ()=>{ // calculate our own for effective CSNs
101
+ // if (d.elements.texts && d.elements.texts.target === `${d.name}.texts`) return d.set($localized,true)
102
+ if (!d.elements || d.name.endsWith('.texts')) return false
103
+ for (let each in d.elements) {
104
+ const e = d.elements [each]
105
+ if (e.localized || e._target && !(_path && e._target.name in _path) && _is_localized(e._target,Object.assign(_path, { [d.name]:1 }))) {
106
+ return true
107
+ }
107
108
  }
108
- }
109
- return d.set($localized,false)
110
- }
109
+ return false
110
+ })
111
+ )
111
112
 
112
113
 
113
114
  // feature-toggled exports
@@ -1,9 +1,8 @@
1
+ let _unfold = (..._) => (_unfold = require ('@sap/cds-compiler/lib/transform/draft/odata')) (..._)
1
2
  const cds = require ('../../index')
2
3
  module.exports = function cds_compile_for_drafts (csn,o) {
3
4
  if (!cds.env.features._ucsn_) return cds.compile.for.odata (csn,o)
4
- const unfold = cds_compile_for_drafts.unfold || (
5
- cds_compile_for_drafts.unfold = require ('@sap/cds-compiler/lib/transform/draft/odata')
6
- )
7
5
  csn = JSON.parse (JSON.stringify (csn)) // REVISIT: workaround for bad test setup
8
- return unfold (csn,o||{})
6
+ csn = _unfold (csn,o||{})
7
+ return csn
9
8
  }