@sap/cds 5.9.7 → 6.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (381) hide show
  1. package/CHANGELOG.md +267 -20
  2. package/apis/services.d.ts +1 -1
  3. package/app/fiori/preview.js +2 -6
  4. package/app/index.js +3 -3
  5. package/bin/build/buildTaskEngine.js +17 -15
  6. package/bin/build/buildTaskFactory.js +29 -19
  7. package/bin/build/buildTaskHandler.js +27 -11
  8. package/bin/build/buildTaskProvider.js +2 -4
  9. package/bin/build/buildTaskProviderFactory.js +11 -16
  10. package/bin/build/constants.js +14 -6
  11. package/bin/build/csv-reader.js +2 -1
  12. package/bin/build/index.js +12 -18
  13. package/bin/build/provider/buildTaskHandlerEdmx.js +3 -39
  14. package/bin/build/provider/buildTaskHandlerFeatureToggles.js +149 -0
  15. package/bin/build/provider/buildTaskHandlerInternal.js +2 -3
  16. package/bin/build/provider/buildTaskProviderInternal.js +108 -239
  17. package/bin/build/provider/fiori/index.js +2 -2
  18. package/bin/build/provider/hana/2migration.js +11 -11
  19. package/bin/build/provider/hana/2tabledata.js +3 -3
  20. package/bin/build/provider/hana/index.js +89 -99
  21. package/bin/build/provider/hana/migrationtable.js +4 -3
  22. package/bin/build/provider/java/index.js +101 -0
  23. package/bin/build/provider/java-cf/index.js +1 -101
  24. package/bin/build/provider/mtx/index.js +90 -53
  25. package/bin/build/provider/mtx/resourcesTarBuilder.js +68 -0
  26. package/bin/build/provider/mtx-sidecar/index.js +110 -0
  27. package/bin/build/provider/node-cf/index.js +1 -308
  28. package/bin/build/provider/nodejs/index.js +189 -0
  29. package/bin/build/util.js +19 -31
  30. package/bin/cds.js +5 -3
  31. package/bin/deploy/to-hana/cfUtil.js +31 -6
  32. package/bin/deploy/to-hana/gitUtil.js +5 -3
  33. package/bin/deploy/to-hana/hana.js +9 -10
  34. package/bin/{build → deploy/to-hana}/mtaUtil.js +10 -9
  35. package/bin/mtx/in-cds.js +19 -7
  36. package/bin/serve.js +56 -21
  37. package/bin/utils/log.js +13 -30
  38. package/bin/version.js +5 -4
  39. package/common.cds +61 -16
  40. package/lib/compile/cdsc.js +3 -2
  41. package/lib/compile/etc/_localized.js +15 -14
  42. package/lib/compile/for/drafts.js +3 -4
  43. package/lib/compile/for/java.js +13 -10
  44. package/lib/compile/for/nodejs.js +8 -8
  45. package/lib/compile/for/odata.js +7 -12
  46. package/lib/compile/for/sql.js +5 -6
  47. package/lib/compile/index.js +5 -4
  48. package/lib/compile/load.js +9 -11
  49. package/lib/compile/minify.js +8 -5
  50. package/lib/compile/parse.js +4 -2
  51. package/lib/compile/resolve.js +18 -15
  52. package/lib/compile/to/edm.js +0 -1
  53. package/lib/compile/to/gql.js +3 -2
  54. package/lib/compile/to/json.js +24 -17
  55. package/lib/connect/bindings.js +3 -2
  56. package/lib/connect/index.js +5 -5
  57. package/lib/core/classes.js +74 -2
  58. package/lib/core/entities.js +52 -3
  59. package/lib/core/reflect.js +2 -1
  60. package/lib/deploy.js +11 -8
  61. package/lib/env/defaults.js +4 -3
  62. package/lib/env/index.js +71 -31
  63. package/lib/env/presets.js +1 -14
  64. package/lib/env/requires.js +71 -20
  65. package/lib/env/serviceBindings.js +147 -0
  66. package/lib/i18n/localize.js +22 -23
  67. package/lib/index.js +148 -144
  68. package/lib/log/errors.js +55 -12
  69. package/lib/log/format/kibana.js +1 -1
  70. package/lib/log/index.js +4 -0
  71. package/lib/ql/SELECT.js +7 -2
  72. package/lib/ql/Whereable.js +8 -2
  73. package/lib/ql/index.js +2 -2
  74. package/lib/req/assert.js +71 -0
  75. package/lib/req/cds-context.js +38 -70
  76. package/lib/req/context.js +34 -21
  77. package/lib/req/request.js +12 -18
  78. package/lib/req/response.js +6 -2
  79. package/lib/req/user.js +30 -22
  80. package/lib/serve/Service-api.js +17 -12
  81. package/lib/serve/Service-dispatch.js +5 -9
  82. package/lib/serve/Service-methods.js +4 -3
  83. package/lib/serve/Transaction.js +24 -21
  84. package/lib/serve/adapters.js +15 -5
  85. package/lib/serve/factory.js +23 -20
  86. package/lib/serve/index.js +51 -54
  87. package/lib/utils/axios.js +8 -12
  88. package/lib/utils/index.js +3 -3
  89. package/lib/utils/resources/index.js +1 -44
  90. package/lib/utils/resources/tar.js +2 -1
  91. package/lib/utils/tests.js +13 -15
  92. package/libx/_runtime/.eslintrc +1 -1
  93. package/libx/_runtime/audit/Service.js +6 -4
  94. package/libx/_runtime/audit/generic/personal/access.js +19 -43
  95. package/libx/_runtime/audit/generic/personal/index.js +40 -34
  96. package/libx/_runtime/audit/generic/personal/modification.js +11 -9
  97. package/libx/_runtime/audit/generic/personal/utils.js +13 -6
  98. package/libx/_runtime/audit/utils/v2.js +6 -3
  99. package/libx/_runtime/auth/index.js +71 -66
  100. package/libx/_runtime/auth/strategies/JWT.js +3 -2
  101. package/libx/_runtime/auth/strategies/mock.js +54 -53
  102. package/libx/_runtime/auth/strategies/xssecUtils.js +3 -4
  103. package/libx/_runtime/auth/strategies/xsuaa.js +3 -2
  104. package/libx/_runtime/auth/utils.js +2 -15
  105. package/libx/_runtime/cds-services/adapter/odata-v4/Dispatcher.js +128 -42
  106. package/libx/_runtime/cds-services/adapter/odata-v4/OData.js +6 -3
  107. package/libx/_runtime/cds-services/adapter/odata-v4/ODataRequest.js +93 -73
  108. package/libx/_runtime/cds-services/adapter/odata-v4/handlers/action.js +10 -45
  109. package/libx/_runtime/cds-services/adapter/odata-v4/handlers/create.js +5 -9
  110. package/libx/_runtime/cds-services/adapter/odata-v4/handlers/error.js +9 -5
  111. package/libx/_runtime/cds-services/adapter/odata-v4/handlers/metadata.js +4 -2
  112. package/libx/_runtime/cds-services/adapter/odata-v4/handlers/read.js +60 -53
  113. package/libx/_runtime/cds-services/adapter/odata-v4/handlers/request.js +1 -1
  114. package/libx/_runtime/cds-services/adapter/odata-v4/handlers/update.js +15 -21
  115. package/libx/_runtime/cds-services/adapter/odata-v4/odata-to-cqn/ExpressionToCQN.js +8 -15
  116. package/libx/_runtime/cds-services/adapter/odata-v4/odata-to-cqn/expandToCQN.js +29 -41
  117. package/libx/_runtime/cds-services/adapter/odata-v4/odata-to-cqn/index.js +1 -4
  118. package/libx/_runtime/cds-services/adapter/odata-v4/odata-to-cqn/readToCQN.js +13 -13
  119. package/libx/_runtime/cds-services/adapter/odata-v4/odata-to-cqn/selectToCQN.js +0 -7
  120. package/libx/_runtime/cds-services/adapter/odata-v4/odata-to-cqn/utils.js +24 -1
  121. package/libx/_runtime/cds-services/adapter/odata-v4/okra/odata-commons/edm/EdmEntityContainer.js +1 -1
  122. package/libx/_runtime/cds-services/adapter/odata-v4/okra/odata-commons/uri/UriHelper.js +4 -3
  123. package/libx/_runtime/cds-services/adapter/odata-v4/okra/odata-commons/utils/PrimitiveValueDecoder.js +4 -5
  124. package/libx/_runtime/cds-services/adapter/odata-v4/okra/odata-commons/utils/ValueConverter.js +4 -3
  125. package/libx/_runtime/cds-services/adapter/odata-v4/okra/odata-commons/validator/ValueValidator.js +5 -3
  126. package/libx/_runtime/cds-services/adapter/odata-v4/okra/odata-server/core/ResponseHeaderSetter.js +2 -0
  127. package/libx/_runtime/cds-services/adapter/odata-v4/okra/odata-server/invocation/DebugSerializingCommand.js +1 -1
  128. package/libx/_runtime/cds-services/adapter/odata-v4/okra/odata-server/invocation/PresetResponseHeadersCommand.js +1 -1
  129. package/libx/_runtime/cds-services/adapter/odata-v4/okra/odata-server/invocation/SerializingCommand.js +1 -1
  130. package/libx/_runtime/cds-services/adapter/odata-v4/okra/odata-server/invocation/SetResponseHeadersCommand.js +1 -1
  131. package/libx/_runtime/cds-services/adapter/odata-v4/okra/odata-server/serializer/ContextURLFactory.js +3 -2
  132. package/libx/_runtime/cds-services/adapter/odata-v4/okra/odata-server/serializer/ErrorJsonSerializer.js +3 -1
  133. package/libx/_runtime/cds-services/adapter/odata-v4/okra/odata-server/serializer/SerializerFactory.js +1 -0
  134. package/libx/_runtime/cds-services/adapter/odata-v4/okra/odata-server/serializer/TrustedResourceJsonSerializer.js +3 -3
  135. package/libx/_runtime/cds-services/adapter/odata-v4/utils/data.js +36 -25
  136. package/libx/_runtime/cds-services/adapter/odata-v4/utils/handlerUtils.js +100 -91
  137. package/libx/_runtime/cds-services/adapter/odata-v4/utils/metaInfo.js +382 -0
  138. package/libx/_runtime/cds-services/adapter/odata-v4/utils/oDataConfiguration.js +1 -4
  139. package/libx/_runtime/cds-services/adapter/odata-v4/utils/omitValues.js +5 -6
  140. package/libx/_runtime/cds-services/adapter/odata-v4/utils/readAfterWrite.js +77 -21
  141. package/libx/_runtime/cds-services/adapter/odata-v4/utils/request.js +3 -11
  142. package/libx/_runtime/cds-services/adapter/odata-v4/utils/result.js +91 -69
  143. package/libx/_runtime/cds-services/adapter/odata-v4/utils/stream.js +27 -6
  144. package/libx/_runtime/cds-services/adapter/rest/utils/validation-checks.js +7 -17
  145. package/libx/_runtime/cds-services/services/Service.js +17 -76
  146. package/libx/_runtime/cds-services/services/utils/columns.js +6 -4
  147. package/libx/_runtime/cds-services/services/utils/compareJson.js +1 -53
  148. package/libx/_runtime/cds-services/services/utils/differ.js +15 -19
  149. package/libx/_runtime/cds-services/util/assert.js +107 -34
  150. package/libx/_runtime/cds.js +1 -31
  151. package/libx/_runtime/common/aspects/Association.js +40 -54
  152. package/libx/_runtime/common/aspects/any.js +61 -6
  153. package/libx/_runtime/common/aspects/entity.js +19 -79
  154. package/libx/_runtime/common/composition/data.js +2 -2
  155. package/libx/_runtime/common/composition/delete.js +8 -7
  156. package/libx/_runtime/common/composition/tree.js +10 -10
  157. package/libx/_runtime/common/composition/update.js +3 -2
  158. package/libx/_runtime/common/constants/events.js +15 -0
  159. package/libx/_runtime/common/error/entry.js +9 -3
  160. package/libx/_runtime/common/error/frontend.js +13 -19
  161. package/libx/_runtime/common/error/index.js +8 -3
  162. package/libx/_runtime/common/generic/auth/capabilities.js +2 -1
  163. package/libx/_runtime/common/generic/auth/constants.js +1 -4
  164. package/libx/_runtime/common/generic/auth/requires.js +1 -1
  165. package/libx/_runtime/common/generic/auth/restrict.js +12 -28
  166. package/libx/_runtime/common/generic/auth/restrictions.js +12 -4
  167. package/libx/_runtime/common/generic/auth/utils.js +2 -1
  168. package/libx/_runtime/common/generic/crud.js +9 -60
  169. package/libx/_runtime/common/generic/etag.js +41 -7
  170. package/libx/_runtime/common/generic/input.js +128 -66
  171. package/libx/_runtime/common/generic/paging.js +9 -3
  172. package/libx/_runtime/common/generic/put.js +2 -2
  173. package/libx/_runtime/common/generic/sorting.js +7 -3
  174. package/libx/_runtime/common/generic/temporal.js +0 -5
  175. package/libx/_runtime/common/i18n/messages.properties +2 -1
  176. package/libx/_runtime/common/utils/binary.js +69 -0
  177. package/libx/_runtime/common/utils/cqn.js +39 -14
  178. package/libx/_runtime/common/utils/cqn2cqn4sql.js +93 -59
  179. package/libx/_runtime/common/utils/csn.js +87 -85
  180. package/libx/_runtime/common/utils/dollar.js +8 -7
  181. package/libx/_runtime/common/utils/draft.js +1 -1
  182. package/libx/_runtime/common/utils/foreignKeyPropagations.js +23 -7
  183. package/libx/_runtime/common/utils/generateOnCond.js +2 -1
  184. package/libx/_runtime/common/utils/keys.js +30 -13
  185. package/libx/_runtime/common/utils/postProcessing.js +6 -1
  186. package/libx/_runtime/common/utils/quotingStyles.js +0 -23
  187. package/libx/_runtime/common/utils/resolveStructured.js +23 -26
  188. package/libx/_runtime/common/utils/resolveView.js +4 -1
  189. package/libx/_runtime/common/utils/rewriteAsterisks.js +3 -0
  190. package/libx/_runtime/common/utils/search2cqn4sql.js +4 -13
  191. package/libx/_runtime/common/utils/searchToLike.js +9 -13
  192. package/libx/_runtime/common/utils/streamProp.js +35 -0
  193. package/libx/_runtime/common/utils/structured.js +12 -18
  194. package/libx/_runtime/common/utils/template.js +3 -5
  195. package/libx/_runtime/common/utils/templateProcessor.js +22 -14
  196. package/libx/_runtime/common/utils/unionCqnTemplate.js +4 -14
  197. package/libx/_runtime/db/Service.js +2 -1
  198. package/libx/_runtime/db/expand/expand-v2.js +2 -2
  199. package/libx/_runtime/db/expand/expandCQNToJoin.js +7 -6
  200. package/libx/_runtime/db/generic/input.js +14 -17
  201. package/libx/_runtime/db/generic/integrity.js +1 -2
  202. package/libx/_runtime/db/generic/update.js +14 -1
  203. package/libx/_runtime/db/query/read.js +0 -1
  204. package/libx/_runtime/db/query/update.js +1 -1
  205. package/libx/_runtime/db/sql-builder/BaseBuilder.js +1 -1
  206. package/libx/_runtime/db/sql-builder/ExpressionBuilder.js +5 -31
  207. package/libx/_runtime/db/sql-builder/InsertBuilder.js +1 -1
  208. package/libx/_runtime/db/sql-builder/ReferenceBuilder.js +0 -9
  209. package/libx/_runtime/db/sql-builder/SelectBuilder.js +11 -10
  210. package/libx/_runtime/db/sql-builder/UpdateBuilder.js +2 -2
  211. package/libx/_runtime/db/sql-builder/annotations.js +1 -2
  212. package/libx/_runtime/db/utils/coloredTxCommands.js +5 -0
  213. package/libx/_runtime/db/utils/columns.js +1 -1
  214. package/libx/_runtime/db/utils/propagateForeignKeys.js +10 -2
  215. package/libx/_runtime/extensibility/activate.js +69 -0
  216. package/libx/_runtime/extensibility/add.js +41 -0
  217. package/libx/_runtime/extensibility/addExtension.js +68 -0
  218. package/libx/_runtime/extensibility/defaults.js +39 -0
  219. package/libx/_runtime/extensibility/{uiflex/handler → handler}/transformREAD.js +0 -0
  220. package/libx/_runtime/extensibility/{uiflex/handler → handler}/transformRESULT.js +2 -2
  221. package/libx/_runtime/extensibility/{uiflex/handler → handler}/transformWRITE.js +2 -2
  222. package/libx/_runtime/extensibility/push.js +61 -0
  223. package/libx/_runtime/extensibility/service.js +21 -0
  224. package/libx/_runtime/extensibility/{uiflex/utils.js → utils.js} +39 -3
  225. package/libx/_runtime/extensibility/validation.js +53 -0
  226. package/libx/_runtime/extensibility/views.js +12 -0
  227. package/libx/_runtime/fiori/generic/activate.js +6 -4
  228. package/libx/_runtime/fiori/generic/before.js +17 -29
  229. package/libx/_runtime/fiori/generic/cancel.js +2 -4
  230. package/libx/_runtime/fiori/generic/delete.js +2 -4
  231. package/libx/_runtime/fiori/generic/edit.js +3 -7
  232. package/libx/_runtime/fiori/generic/index.js +31 -0
  233. package/libx/_runtime/fiori/generic/new.js +2 -4
  234. package/libx/_runtime/fiori/generic/patch.js +4 -8
  235. package/libx/_runtime/fiori/generic/prepare.js +2 -4
  236. package/libx/_runtime/fiori/generic/read.js +137 -162
  237. package/libx/_runtime/fiori/generic/readOverDraft.js +10 -4
  238. package/libx/_runtime/fiori/utils/handler.js +10 -5
  239. package/libx/_runtime/fiori/utils/where.js +1 -4
  240. package/libx/_runtime/hana/Service.js +14 -7
  241. package/libx/_runtime/hana/customBuilder/CustomSelectBuilder.js +1 -1
  242. package/libx/_runtime/hana/dynatrace.js +2 -2
  243. package/libx/_runtime/hana/localized.js +7 -6
  244. package/libx/_runtime/hana/pool.js +9 -6
  245. package/libx/_runtime/hana/search.js +2 -3
  246. package/libx/_runtime/hana/{searchToContains.js → search2Contains.js} +5 -2
  247. package/libx/_runtime/hana/search2cqn4sql.js +20 -17
  248. package/libx/_runtime/index.js +2 -6
  249. package/libx/_runtime/messaging/AMQPWebhookMessaging.js +11 -2
  250. package/libx/_runtime/messaging/common-utils/AMQPClient.js +4 -3
  251. package/libx/_runtime/messaging/common-utils/appId.js +9 -0
  252. package/libx/_runtime/messaging/common-utils/authorizedRequest.js +2 -18
  253. package/libx/_runtime/messaging/common-utils/connections.js +1 -1
  254. package/libx/_runtime/messaging/enterprise-messaging-shared.js +2 -2
  255. package/libx/_runtime/messaging/enterprise-messaging-utils/EMManagement.js +305 -231
  256. package/libx/_runtime/messaging/enterprise-messaging-utils/cloudEvents.js +2 -2
  257. package/libx/_runtime/messaging/enterprise-messaging-utils/options-management.js +15 -8
  258. package/libx/_runtime/messaging/enterprise-messaging-utils/options-messaging.js +57 -14
  259. package/libx/_runtime/messaging/enterprise-messaging.js +14 -19
  260. package/libx/_runtime/messaging/file-based.js +2 -1
  261. package/libx/_runtime/messaging/http-utils/token.js +18 -6
  262. package/libx/_runtime/messaging/message-queuing-utils/options-management.js +22 -12
  263. package/libx/_runtime/messaging/message-queuing-utils/options-messaging.js +27 -14
  264. package/libx/_runtime/messaging/message-queuing.js +138 -85
  265. package/libx/_runtime/messaging/outbox/utils.js +13 -7
  266. package/libx/_runtime/messaging/redis-messaging.js +0 -1
  267. package/libx/_runtime/messaging/service.js +4 -1
  268. package/libx/_runtime/remote/Service.js +24 -18
  269. package/libx/_runtime/remote/utils/client.js +84 -46
  270. package/libx/_runtime/remote/utils/data.js +23 -6
  271. package/libx/_runtime/sqlite/Service.js +14 -13
  272. package/libx/_runtime/sqlite/convertAssocToOneManaged.js +2 -0
  273. package/libx/_runtime/sqlite/customBuilder/CustomSelectBuilder.js +1 -0
  274. package/libx/_runtime/sqlite/execute.js +3 -9
  275. package/libx/_runtime/types/api.js +23 -11
  276. package/libx/common/utils/ucsn.js +15 -9
  277. package/libx/odata/afterburner.js +109 -29
  278. package/libx/odata/cqn2odata.js +48 -9
  279. package/libx/odata/grammar.pegjs +261 -157
  280. package/libx/odata/index.js +21 -9
  281. package/libx/odata/parseToCqn.js +8 -5
  282. package/libx/odata/parser.js +1 -1
  283. package/libx/odata/utils.js +13 -3
  284. package/libx/rest/RestAdapter.js +173 -113
  285. package/libx/rest/RestRequest.js +3 -2
  286. package/libx/rest/middleware/create.js +8 -6
  287. package/libx/rest/middleware/delete.js +6 -13
  288. package/libx/rest/middleware/error.js +1 -1
  289. package/libx/rest/middleware/input.js +6 -6
  290. package/libx/rest/middleware/operation.js +8 -3
  291. package/libx/rest/middleware/parse.js +3 -3
  292. package/libx/rest/middleware/payload.js +12 -0
  293. package/libx/rest/middleware/read.js +12 -2
  294. package/libx/rest/middleware/update.js +3 -3
  295. package/package.json +4 -6
  296. package/server.js +3 -44
  297. package/srv/extensibility-service.cds +56 -0
  298. package/srv/extensibility-service.js +1 -0
  299. package/srv/extensions.cds +8 -0
  300. package/srv/model-provider.cds +59 -0
  301. package/srv/model-provider.js +163 -0
  302. package/srv/mtx.cds +2 -0
  303. package/srv/mtx.js +22 -0
  304. package/srv/outbox.cds +2 -0
  305. package/tasks/enterprise-messaging-deploy.js +19 -12
  306. package/lib/serve/Service-compat.js +0 -36
  307. package/libx/_runtime/audit/generic/personal/constants.js +0 -4
  308. package/libx/_runtime/auth/strategies/dwc.js +0 -45
  309. package/libx/_runtime/cds-services/adapter/odata-v4/utils/dispatcherUtils.js +0 -56
  310. package/libx/_runtime/cds-services/adapter/rest/Rest.js +0 -183
  311. package/libx/_runtime/cds-services/adapter/rest/RestRequest.js +0 -67
  312. package/libx/_runtime/cds-services/adapter/rest/handlers/create.js +0 -82
  313. package/libx/_runtime/cds-services/adapter/rest/handlers/delete.js +0 -39
  314. package/libx/_runtime/cds-services/adapter/rest/handlers/operation.js +0 -63
  315. package/libx/_runtime/cds-services/adapter/rest/handlers/read.js +0 -52
  316. package/libx/_runtime/cds-services/adapter/rest/handlers/update.js +0 -81
  317. package/libx/_runtime/cds-services/adapter/rest/rest-to-cqn/index.js +0 -56
  318. package/libx/_runtime/cds-services/adapter/rest/rest-to-cqn/utils.js +0 -33
  319. package/libx/_runtime/cds-services/adapter/rest/to.js +0 -8
  320. package/libx/_runtime/cds-services/adapter/rest/utils/binary.js +0 -50
  321. package/libx/_runtime/cds-services/adapter/rest/utils/data.js +0 -117
  322. package/libx/_runtime/cds-services/adapter/rest/utils/header-checks.js +0 -14
  323. package/libx/_runtime/cds-services/adapter/rest/utils/key-value-utils.js +0 -30
  324. package/libx/_runtime/cds-services/adapter/rest/utils/parse-url.js +0 -250
  325. package/libx/_runtime/cds-services/adapter/rest/utils/result.js +0 -26
  326. package/libx/_runtime/cds-services/services/utils/handlerUtils.js +0 -200
  327. package/libx/_runtime/common/aspects/utils.js +0 -152
  328. package/libx/_runtime/common/toggles/handler.js +0 -21
  329. package/libx/_runtime/common/utils/extensibilityUtils.js +0 -18
  330. package/libx/_runtime/extensibility/mps/index.js +0 -5
  331. package/libx/_runtime/extensibility/mps/service.js +0 -111
  332. package/libx/_runtime/extensibility/mps/tar.js +0 -42
  333. package/libx/_runtime/extensibility/mps/utils.js +0 -11
  334. package/libx/_runtime/extensibility/uiflex/index.js +0 -54
  335. package/libx/_runtime/extensibility/uiflex/service.js +0 -276
  336. package/libx/_runtime/messaging/common-utils/naming-conventions.js +0 -20
  337. package/libx/_runtime/remote/utils/client-types.d.ts +0 -7
  338. package/libx/gql/GraphQLAdapter.js +0 -33
  339. package/libx/gql/constants/adapter.js +0 -69
  340. package/libx/gql/constants/cds.js +0 -18
  341. package/libx/gql/constants/graphql.js +0 -33
  342. package/libx/gql/readme.md +0 -1
  343. package/libx/gql/resolvers/crud/create.js +0 -20
  344. package/libx/gql/resolvers/crud/delete.js +0 -29
  345. package/libx/gql/resolvers/crud/index.js +0 -6
  346. package/libx/gql/resolvers/crud/read.js +0 -30
  347. package/libx/gql/resolvers/crud/update.js +0 -42
  348. package/libx/gql/resolvers/crud/utils/index.js +0 -36
  349. package/libx/gql/resolvers/field.js +0 -5
  350. package/libx/gql/resolvers/index.js +0 -7
  351. package/libx/gql/resolvers/mutation.js +0 -23
  352. package/libx/gql/resolvers/parse/ast/enrich.js +0 -52
  353. package/libx/gql/resolvers/parse/ast/fragment.js +0 -11
  354. package/libx/gql/resolvers/parse/ast/fromObject.js +0 -39
  355. package/libx/gql/resolvers/parse/ast/index.js +0 -3
  356. package/libx/gql/resolvers/parse/ast/meta.js +0 -4
  357. package/libx/gql/resolvers/parse/ast/variable.js +0 -7
  358. package/libx/gql/resolvers/parse/ast2cqn/columns.js +0 -44
  359. package/libx/gql/resolvers/parse/ast2cqn/entries.js +0 -31
  360. package/libx/gql/resolvers/parse/ast2cqn/index.js +0 -8
  361. package/libx/gql/resolvers/parse/ast2cqn/limit.js +0 -6
  362. package/libx/gql/resolvers/parse/ast2cqn/orderBy.js +0 -24
  363. package/libx/gql/resolvers/parse/ast2cqn/utils/index.js +0 -3
  364. package/libx/gql/resolvers/parse/ast2cqn/where.js +0 -70
  365. package/libx/gql/resolvers/parse/utils/index.js +0 -8
  366. package/libx/gql/resolvers/query.js +0 -13
  367. package/libx/gql/resolvers/root.js +0 -34
  368. package/libx/gql/schema/generate.js +0 -18
  369. package/libx/gql/schema/index.js +0 -5
  370. package/libx/gql/schema/mutation.js +0 -76
  371. package/libx/gql/schema/query.js +0 -108
  372. package/libx/gql/schema/typeDefMap.js +0 -45
  373. package/libx/gql/schema/utils/index.js +0 -54
  374. package/libx/gql/utils/index.js +0 -12
  375. package/libx/rest/middleware/auth.js +0 -20
  376. package/libx/rest/middleware/content.js +0 -19
  377. package/srv/flex.cds +0 -21
  378. package/srv/flex.js +0 -1
  379. package/srv/mps.cds +0 -23
  380. package/srv/mps.js +0 -1
  381. package/srv/outbox.js +0 -0
@@ -2,12 +2,7 @@ const cds = require ('..')
2
2
  const {existsSync, readdirSync} = require ('fs')
3
3
  const {join,dirname,resolve,parse} = require ('path')
4
4
 
5
- const DEBUG = process.env.DEBUG_I18N && console.warn
6
- const conf = cds.env && cds.env.i18n || {}
7
- const DefaultLanguage = conf.default_language || 'en'
8
- const FallbackBundle = conf.fallback_bundle || ''
9
- const I18nFolders = conf.folders || [ '_i18n', 'i18n' ]
10
- const I18nFile = conf.file || 'i18n'
5
+ const DEBUG = cds.debug('i18n')
11
6
 
12
7
 
13
8
  module.exports = Object.assign (localize, {
@@ -38,7 +33,7 @@ function localizeString (aString, bundle) {
38
33
  if (!bundle || !aString) return aString
39
34
  if (typeof aString === 'object') aString = JSON.stringify(aString, null, 2)
40
35
  // quick check for presence of any text key, to avoid expensive operation below
41
- if (aString.indexOf(TEXT_KEY_MARKER) < 0) return aString
36
+ if (!aString.includes(TEXT_KEY_MARKER)) return aString
42
37
  const escape = aString.startsWith('<?xml') ? escapeXmlAttr : /^[{[]/.test(aString) ? escapeJson : v=>v
43
38
  return aString.replace (TEXT_KEYS, (_, key) => {
44
39
  const val = bundle[key]
@@ -62,7 +57,7 @@ function bundles4 (model, locales) { // NOSONAR
62
57
  if (locales.length === 1 && (locales[0] === '*' || locales[0] === 'all')) {
63
58
  locales = allLocales4 (folders)
64
59
  if (!locales) return {}
65
- if (!locales.includes(FallbackBundle)) locales.push (FallbackBundle)
60
+ if (!locales.includes(cds.env.i18n.fallback_bundle)) locales.push (cds.env.i18n.fallback_bundle)
66
61
  }
67
62
  DEBUG && DEBUG ('Languages:', locales)
68
63
 
@@ -70,7 +65,7 @@ function bundles4 (model, locales) { // NOSONAR
70
65
  for (let each of locales) {
71
66
  let bundle = bundle4 (model, each)
72
67
  if (bundle) {
73
- DEBUG && DEBUG (bundle.toString())
68
+ DEBUG && DEBUG (bundle)
74
69
  yield [ each, bundle ]
75
70
  }
76
71
  }
@@ -85,14 +80,16 @@ function bundles4 (model, locales) { // NOSONAR
85
80
  function allLocales4 (folders) {
86
81
  // find all languages in all folders
87
82
  const files = folders
88
- .map (folder => readdirSync(folder).filter (e => e.startsWith(I18nFile)).map(i18nFile => join (folder, i18nFile)))
89
- .reduce ((files, file) => files.concat(file)) // flatten
83
+ .map (folder => readdirSync(folder)
84
+ .filter (e => e.startsWith(cds.env.i18n.file))
85
+ .map(i18nFile => join (folder, i18nFile))
86
+ ).reduce ((files, file) => files.concat(file)) // flatten
90
87
  if (files.length === 0) {
91
88
  DEBUG && DEBUG ('No languages for folders:', folders)
92
89
  return null
93
90
  }
94
91
 
95
- if (files[0].endsWith('.csv')) {
92
+ if (files[0].endsWith('.csv')) {
96
93
  return cds.load.csv (files[0])[0].slice(1)
97
94
  } else {
98
95
  const locales = new Set()
@@ -100,8 +97,10 @@ function allLocales4 (folders) {
100
97
  const parsed = parse(file)
101
98
  if (parsed.ext === '.json') {
102
99
  Object.keys(require(file)).forEach(locale => locales.add(locale))
103
- } else if (parsed.ext === '.properties') {
104
- locales.add(parsed.name.slice(5))
100
+ }
101
+ else if (parsed.ext === '.properties') {
102
+ const match = /_(\w+)$/.exec(parsed.name)
103
+ if (match) locales.add(match[1])
105
104
  }
106
105
  })
107
106
  return Array.from(locales)
@@ -121,11 +120,11 @@ function bundle4 (model, locale) {
121
120
  const folders = folders4 (model); if (!folders.length) return //> no folders, hence no bundles found at all
122
121
  const bundle = {}
123
122
 
124
- add (FallbackBundle) // e.g. i18n.properties
125
- if (locale === FallbackBundle) return bundle
123
+ add (cds.env.i18n.fallback_bundle) // e.g. i18n.properties
124
+ if (locale === cds.env.i18n.fallback_bundle) return bundle
126
125
 
127
- add (DefaultLanguage) // e.g. i18n_en.properties
128
- if (locale === DefaultLanguage) return bundle
126
+ add (cds.env.i18n.default_language) // e.g. i18n_en.properties
127
+ if (locale === cds.env.i18n.default_language) return bundle
129
128
 
130
129
  add (locale) // e.g. i18n_de.properties
131
130
  return bundle
@@ -133,7 +132,7 @@ function bundle4 (model, locale) {
133
132
  function add (lang) {
134
133
  for (let each of folders) {
135
134
  const suffix = lang === '' ? '' : '_' + lang
136
- const file = join (each, I18nFile), key = file+suffix
135
+ const file = join (each, cds.env.i18n.file), key = file+suffix
137
136
  const next = bundle4[key] || (bundle4[key] = (
138
137
  loadFromJSON (file, lang) ||
139
138
  cds.load.properties (file + suffix.replace('-','_')) || // e.g. en-UK --> en_UK
@@ -158,7 +157,7 @@ function folders4 (model) {
158
157
  if (!model.$sources) return []
159
158
  const folders=[]; for (let src of model.$sources) {
160
159
  let folder = folder4 (src)
161
- if (!folder || folders.indexOf(folder) >= 0) continue
160
+ if (!folder || folders.includes(folder)) continue
162
161
  folders.push(folder) // use an array here to not screw up the folder order
163
162
  }
164
163
 
@@ -174,7 +173,7 @@ function folder4 (loc) {
174
173
  // already cached from a former lookup?
175
174
  if (loc in folder4) return folder4[loc]
176
175
  // check whether a <loc>/_i18n extists
177
- for (let i18n of I18nFolders) {
176
+ for (let i18n of cds.env.i18n.folders) {
178
177
  const f = join (loc, i18n)
179
178
  if (existsSync(f)) return folder4[loc] = f
180
179
  }
@@ -184,7 +183,7 @@ function folder4 (loc) {
184
183
  }
185
184
 
186
185
 
187
- function loadFromJSON (res, lang=DefaultLanguage) {
186
+ function loadFromJSON (res, lang=cds.env.i18n.default_language) {
188
187
  try {
189
188
  const bundles = require (resolve (cds.root,res+'.json'))
190
189
  return bundles[lang] || bundles [(lang.match(/\w+/)||[])[0]]
@@ -193,7 +192,7 @@ function loadFromJSON (res, lang=DefaultLanguage) {
193
192
  }
194
193
  }
195
194
 
196
- function loadFromCSV (res, lang=DefaultLanguage) {
195
+ function loadFromCSV (res, lang=cds.env.i18n.default_language) {
197
196
  let csv = cds.load.csv(res+'.csv'); if (!csv) return
198
197
  let [header, ...rows] = csv
199
198
  if (lang === '*') return header.slice(1).reduce ((all,lang,i) => {
package/lib/index.js CHANGED
@@ -1,149 +1,153 @@
1
1
  /** @typedef {import './serve/Service-api'} Service */
2
- if (global.cds) Object.assign(module,{exports:global.cds}) ; else {
3
-
4
- const facade = class cds extends require('events') {
5
-
6
- get env() { return super.env = require('./env') }
7
- get requires() { return super.requires = this.env.required_services_or_defs }
8
- get version() { return super.version = require('../package.json').version }
9
- get builtin() { return super.builtin = require ('./core') }
10
- get service() { return super.service = extend (this.builtin.classes.service) .with ({
11
- /** @param x {(this:Service, srv:Service) => any} */ impl: x=>x,
12
- /** @type {{ [path:string] : Service }} */ paths: {},
13
- /** @type Service[] */ providers: [],
14
- factory: require ('./serve/factory'),
15
- adapters: require ('./serve/adapters'),
16
- bindings: require ('./connect/bindings'),
17
- })}
18
- /** @type {import './req/context'} */
19
- get context() { return require('./req/cds-context').for(this) }
20
- set context(_){ require('./req/cds-context').for(this,_) }
21
- get spawn() { return super.spawn = require('./req/cds-context').spawn }
22
-
23
- emit (eve, ...args) {
24
- if (eve === 'served') return Promise.all (this.listeners(eve).map (l => l.call(this,...args)))
25
- else return super.emit (eve, ...args)
26
- }
27
- }
28
2
 
29
- const { extend, lazify, lazified } = require ('./lazy')
30
- const _class = lazy => cds.builtin.classes [lazy]
31
- const _require = require; require = lazified (module) // eslint-disable-line
32
-
33
- /** cds is the central facade to all cds functions */
34
- const cds = module.exports = global.cds = extend (new facade) .with ({
35
-
36
- // Builtin types and classes
37
- Association:_class,
38
- Composition:_class,
39
- entity:_class,
40
- event:_class,
41
- type:_class,
42
- array:_class,
43
- struct:_class,
44
-
45
- // Model Reflection
46
- reflect: require ('./core/reflect'),
47
- linked: require ('./core/reflect'),
48
- infer: require ('./core/infer'),
49
-
50
- // Loading and Compiling Models
51
- model: undefined,
52
- compiler: require ('./compile/cdsc'),
53
- compile: require ('./compile'),
54
- resolve: require ('./compile/resolve'),
55
- load: require ('./compile/load'), get: lazy => cds.load.parsed,
56
- parse: require ('./compile/parse'),
57
- minify: require ('./compile/minify'),
58
- extend: require ('./compile/extend'),
59
- deploy: require ('./deploy'),
60
-
61
- // Providing and Consuming Services
62
- services: new class IterableServices {
63
- *[Symbol.iterator]() {for (let e in this) yield this[e]}
64
- get _pending(){ return super._pending = {}}
65
- },
66
- serve: require ('./serve'),
67
- server: require ('../server'),
68
- connect: require ('./connect'),
69
-
70
- // Core Services API
71
- Service: require ('./serve/Service-api'),
72
- EventContext: require ('./req/context'),
73
- Request: require ('./req/request'),
74
- Event: require ('./req/event'),
75
- User: require ('./req/user'),
76
- ql: require ('./ql'),
77
- tx: (..._) => (cds.db || cds.Service.prototype) .tx (..._),
78
- /** @type Service */ db: undefined,
79
-
80
- // Protocols and Periphery
81
- ApplicationService: lazy => require('../libx/_runtime/cds-services/services/Service.js'),
82
- MessagingService: lazy => require('../libx/_runtime/messaging/service.js'),
83
- DatabaseService: lazy => require('../libx/_runtime/db/Service.js'),
84
- RemoteService: lazy => require('../libx/_runtime/remote/Service.js'),
85
- AuditLogService: lazy => require('../libx/_runtime/audit/Service.js'),
86
- odata: require('../libx/odata'),
87
-
88
- // Helpers
89
- localize: require ('./i18n/localize'),
90
- error: require ('./log/errors'),
91
- utils: require ('./utils'),
92
- test: require ('./utils/tests'),
93
- log: require ('./log'), debug: lazy => cds.log.debug,
94
- exec: require ('../bin/cds'),
95
- clone: m => JSON.parse (JSON.stringify(m)),
96
- lazified, lazify,
97
-
98
- // Configuration & Information
99
- home: __dirname.slice(0,-4),
100
- root: lazy => process.cwd(),
101
-
102
- })
103
-
104
-
105
- // cds as shortcut to cds.db -> for compatibility only
106
- extend (cds.__proto__) .with ({
107
- get entities(){ return (cds.db||_missing).entities },
108
- transaction: (..._) => (cds.db||_missing).transaction(..._),
109
- run: (..._) => (cds.db||_missing).run(..._),
110
- foreach: (..._) => (cds.db||_missing).foreach(..._),
111
- stream: (..._) => (cds.db||_missing).stream(..._),
112
- read: (..._) => (cds.db||_missing).read(..._),
113
- create: (..._) => (cds.db||_missing).create(..._),
114
- insert: (..._) => (cds.db||_missing).insert(..._),
115
- update: (..._) => (cds.db||_missing).update(..._),
116
- delete: (..._) => (cds.db||_missing).delete(..._),
117
- disconnect: (..._) => (cds.db||_missing).disconnect(..._),
118
- })
119
- /** @type Service */ const _missing = new Proxy ({},{
120
- get:function fn(_,p){ cds.error.no_primary_db(p,fn) }
121
- })
122
-
123
- // legacy and to be moved stuff -> hidden for tools in cds.__proto__
124
- extend (cds.__proto__) .with (lazified ({
125
- /** @deprecated */ in: (cwd) => !cwd ? cds : {__proto__:cds, cwd, env: cds.env.for('cds',cwd) },
126
- mtx: lazy => require('../bin/mtx/in-cds'),
127
- build: lazy => require('../bin/build'),
128
- }))
129
-
130
- // Add global forwards to cds.ql and cds.parse
131
- const odp = Object.defineProperty, _global = (_,...pp) => pp.forEach (p => odp(global,p,{
132
- configurable:true, get:()=>{ let v=cds[_][p]; odp(this,p,{value:v}); return v }
133
- }))
134
- _global ('ql','SELECT','INSERT','UPDATE','DELETE','CREATE','DROP')
135
- _global ('parse','CDL','CQL','CXL')
136
-
137
- // Check Node.js version
138
- if (process.env.CDS_STRICT_NODE_VERSION !== 'false' && !process.env['WORKSPACE_ID']) { // FIXME remove as soon as BAS is ready for the Node version check below
139
- const v = version => { let vv = version.split('.'); return { version, major: +vv[0], minor: +vv[1] }}
140
- const required = v('12.18'), given = v(process.version.match(/^v(\d+\.\d+)/)[1])
141
- if (given.major < required.major || given.major === required.major && given.minor < required.minor) process.exit (process.stderr.write (`
142
- Node.js v${required.version} or higher is required for @sap/cds.
143
- Current v${given.version} does not satisfy this.
144
- \n`) || 1)
3
+ const facade = class cds extends require('events') {
4
+
5
+ get env() { return super.env = require('./env').for('cds',cds.root) }
6
+ get requires() { return super.requires = this.env.required_services_or_defs }
7
+ get version() { return super.version = require('../package.json').version }
8
+ get builtin() { return super.builtin = require('./core') }
9
+ get service() { return super.service = extend(this.builtin.classes.service) .with (_service) }
10
+ get _context() { return super._context = require('./req/cds-context') }
11
+ get context() { return this._context._for(this) }
12
+ set context(_){ this._context._for(this,_) }
13
+ get spawn() { return super.spawn = this._context.spawn }
14
+
15
+ emit (eve, ...args) {
16
+ if (eve === 'served') return Promise.all (this.listeners(eve).map (l => l.call(this,...args)))
17
+ else return super.emit (eve, ...args)
145
18
  }
19
+ }
146
20
 
147
- // restore require for subsequent uses in lazy getters
148
- require = _require // eslint-disable-line
21
+ const { extend, lazify, lazified } = require ('./lazy')
22
+ const _class = lazy => cds.builtin.classes [lazy]
23
+ const _require = require; require = lazified (module) // eslint-disable-line
24
+ const _service = lazified ({ // nested facade for service-related modules
25
+ /** @param x {(this:Service, srv:Service, ...etc) => any} */ impl: x=>x,
26
+ /** @type {{ [path:string] : Service }} */ paths: {},
27
+ /** @type Service[] */ providers: [],
28
+ factory: require ('./serve/factory'),
29
+ adapters: require ('./serve/adapters'),
30
+ bindings: require ('./connect/bindings'),
31
+ })
32
+
33
+ /** cds is the central facade to all cds functions */
34
+ const cds = module.exports = extend (new facade) .with ({
35
+
36
+ // Builtin types and classes
37
+ Association:_class,
38
+ Composition:_class,
39
+ entity:_class,
40
+ event:_class,
41
+ type:_class,
42
+ array:_class,
43
+ struct:_class,
44
+
45
+ // Model Reflection
46
+ reflect: require ('./core/reflect'),
47
+ linked: require ('./core/reflect'),
48
+ infer: require ('./core/infer'),
49
+
50
+ // Loading and Compiling Models
51
+ model: undefined,
52
+ compiler: require ('./compile/cdsc'),
53
+ compile: require ('./compile'),
54
+ resolve: require ('./compile/resolve'),
55
+ load: require ('./compile/load'), get: lazy => cds.load.parsed,
56
+ parse: require ('./compile/parse'),
57
+ minify: require ('./compile/minify'),
58
+ extend: require ('./compile/extend'),
59
+ deploy: require ('./deploy'),
60
+
61
+ // Providing and Consuming Services
62
+ services: new class IterableServices {
63
+ *[Symbol.iterator]() {for (let e in this) yield this[e]}
64
+ get _pending(){ let p={}; Object.defineProperty(this,'_pending',{value:p}); return p }
65
+ },
66
+ serve: require ('./serve'),
67
+ server: require ('../server'),
68
+ connect: require ('./connect'),
69
+
70
+ // Core Services API
71
+ Service: require ('./serve/Service-api'),
72
+ EventContext: require ('./req/context'),
73
+ Request: require ('./req/request'),
74
+ Event: require ('./req/event'),
75
+ User: require ('./req/user'),
76
+ ql: require ('./ql'),
77
+ tx: (..._) => (cds.db || cds.Service.prototype) .tx (..._),
78
+ /** @type Service */ db: undefined,
79
+
80
+ // Protocols and Periphery
81
+ ApplicationService: lazy => require('../libx/_runtime/cds-services/services/Service.js'),
82
+ MessagingService: lazy => require('../libx/_runtime/messaging/service.js'),
83
+ DatabaseService: lazy => require('../libx/_runtime/db/Service.js'),
84
+ RemoteService: lazy => require('../libx/_runtime/remote/Service.js'),
85
+ AuditLogService: lazy => require('../libx/_runtime/audit/Service.js'),
86
+ odata: require('../libx/odata'),
87
+
88
+ // Helpers
89
+ localize: require ('./i18n/localize'),
90
+ error: require ('./log/errors'),
91
+ utils: require ('./utils'),
92
+ test: require ('./utils/tests'),
93
+ log: require ('./log'), debug: lazy => cds.log.debug,
94
+ exec: require ('../bin/cds'),
95
+ clone: m => JSON.parse (JSON.stringify(m)),
96
+ lazified, lazify,
97
+
98
+ // Configuration & Information
99
+ home: __dirname.slice(0,-4),
100
+ root: lazy => process.cwd(),
101
+
102
+ })
103
+
104
+
105
+ // cds as shortcut to cds.db -> for compatibility only
106
+ extend (cds.__proto__) .with ({
107
+ get entities(){ return (cds.db||_missing).entities },
108
+ transaction: (..._) => (cds.db||_missing).transaction(..._),
109
+ run: (..._) => (cds.db||_missing).run(..._),
110
+ foreach: (..._) => (cds.db||_missing).foreach(..._),
111
+ stream: (..._) => (cds.db||_missing).stream(..._),
112
+ read: (..._) => (cds.db||_missing).read(..._),
113
+ create: (..._) => (cds.db||_missing).create(..._),
114
+ insert: (..._) => (cds.db||_missing).insert(..._),
115
+ update: (..._) => (cds.db||_missing).update(..._),
116
+ delete: (..._) => (cds.db||_missing).delete(..._),
117
+ disconnect: (..._) => (cds.db||_missing).disconnect(..._),
118
+ })
119
+ /** @type Service */ const _missing = new Proxy ({},{
120
+ get:function fn(_,p){ cds.error._no_primary_db(p,fn) }
121
+ })
122
+
123
+ // legacy and to be moved stuff -> hidden for tools in cds.__proto__
124
+ extend (cds.__proto__) .with (lazified ({
125
+ /** @deprecated */ in: (cwd) => !cwd ? cds : {__proto__:cds, cwd, env: cds.env.for('cds',cwd) },
126
+ mtx: lazy => require('../bin/mtx/in-cds'),
127
+ build: lazy => require('../bin/build'),
128
+ }))
129
+
130
+ // Add global forwards to cds.ql and cds.parse
131
+ const odp = Object.defineProperty, _global = (_,...pp) => pp.forEach (p => odp(global,p,{
132
+ configurable:true, get:()=>{ let v=cds[_][p]; odp(this,p,{value:v}); return v }
133
+ }))
134
+ _global ('ql','SELECT','INSERT','UPDATE','DELETE','CREATE','DROP')
135
+ _global ('parse','CDL','CQL','CXL')
136
+
137
+ // Check Node.js version
138
+ if (process.env.CDS_STRICT_NODE_VERSION !== 'false' && !process.env['WORKSPACE_ID']) { // FIXME remove as soon as BAS is ready for the Node version check below
139
+ const v = version => { let vv = version.split('.'); return { version, major: +vv[0], minor: +vv[1] }}
140
+ const required = v('14.15'), given = v(process.version.match(/^v(\d+\.\d+)/)[1])
141
+ if (given.major < required.major || given.major === required.major && given.minor < required.minor) process.exit (process.stderr.write (`
142
+ Node.js v${required.version} or higher is required for @sap/cds.
143
+ Current v${given.version} does not satisfy this.
144
+ \n`) || 1)
149
145
  }
146
+
147
+ // restore require for subsequent uses in lazy getters
148
+ require = _require // eslint-disable-line
149
+
150
+ if (process.env.CDS_GLOBAL) // TODO for stakeholder-tests only. Remove after cds 6.
151
+ Object.assign(module,{ exports: global.cds || (global.cds = cds)})
152
+ else
153
+ global.cds = cds
package/lib/log/errors.js CHANGED
@@ -1,22 +1,65 @@
1
- const error = exports = module.exports = (..._) => { throw _error(..._) }
2
- const _error = (msg, _details, _base = error, ...etc) => {
3
- if (msg.raw) return _error (String.raw (msg,_details,_base,...etc))
4
- const e = msg instanceof Error ? msg : new Error (msg)
5
- if (_base) Error.captureStackTrace (e,_base)
6
- if (_details) Object.assign (e,_details)
7
- return e
8
- }
1
+ const { format } = require('util'), _formatted = v => format(v)
2
+
9
3
 
10
- exports.reject = function (msg, _details, _base) {
11
- return Promise.reject(_error(msg, _details, _base))
4
+ /**
5
+ * This is the implementation of cds.error().
6
+ * Usage variants:
7
+ *
8
+ * cds.error `Message with formatted: ${{foo:'bar'}}`
9
+ * cds.error ({ message, code, ... })
10
+ * cds.error (message, { code, ... })
11
+ * let e = new cds.error(...) //> will not throw
12
+ *
13
+ * Calling `cds.error()` with `new` returns the newly created Error,
14
+ * while calling it without `new` it throws immediately. The latter is
15
+ * useful for usages like that:
16
+ *
17
+ * let x = y || cds.error `Argument 'y' must not be null`
18
+ */
19
+ const error = exports = module.exports = function cds_error (msg, _details, _base) {
20
+ let e; if (msg.raw) e = new error (error.message(...arguments))
21
+ else {
22
+ e = msg.stack ? msg : typeof msg === 'string' ? new Error(msg) : Object.assign(new Error,msg)
23
+ Error.captureStackTrace (e,_base||error)
24
+ if (_details) Object.assign (e,_details)
25
+ }
26
+ if (new.target) return e; else throw e
12
27
  }
13
28
 
29
+
30
+ /**
31
+ * Constructs a message from a tagged template string. In contrast to usual
32
+ * template strings embedded values are formatted using `util.format`
33
+ * not just `toString()`.
34
+ *
35
+ * let x = `A sample message with ${'a string'}, ${{an:'object'}}, and ${[1,2,3]}`
36
+ * let y = cds.error.message`with ${'a string'}, ${{an:'object'}}, and ${[1,2,3]}`
37
+ * //> x = A sample message with a string and [object Object], and 1,2,3
38
+ * //> y = with a string, { an: 'object' }, and [ 1, 2, 3 ]
39
+ */
40
+ exports.message = (strings,...values) => String.raw(strings,...values.map(_formatted))
41
+
42
+
43
+ /**
44
+ * Use that to construct and throw errors from a tagged template string
45
+ * in validations of function arguments.
46
+ * Use it like that:
47
+ *
48
+ * let x = {foo:'bar'}
49
+ * typeof x === 'string' || cds.error.expected `${{x}} to be a string`
50
+ * //> Error: Expected argument 'x' to be a string, but got: { foo: 'bar' }
51
+ */
14
52
  exports.expected = ([,type], arg) => {
15
53
  const [ name, value ] = Object.entries(arg)[0]
16
54
  return error `Expected argument '${name}'${type}, but got: ${require('util').inspect(value,{depth:11})}`
17
55
  }
18
56
 
19
- exports.duplicate_cds = (...locations) => {
57
+
58
+ //
59
+ // Private helpers ...
60
+ //
61
+
62
+ exports._duplicate_cds = (...locations) => {
20
63
  const { local } = require('../utils')
21
64
  throw error `Duplicate @sap/cds/common!
22
65
 
@@ -29,7 +72,7 @@ exports.duplicate_cds = (...locations) => {
29
72
  `
30
73
  }
31
74
 
32
- exports.no_primary_db = (p,_base) => error (`Not connected to primary datasource!
75
+ exports._no_primary_db = (p,_base) => error (`Not connected to primary datasource!
33
76
 
34
77
  Attempt to use 'cds.${p}' without prior connect to primary datasource,
35
78
  i.e. cds.connect.to('db').
@@ -57,5 +57,5 @@ module.exports = (module, level, ...args) => {
57
57
  }
58
58
 
59
59
  // return array with the stringified toLog (to avoid multiple log lines) as the sole element
60
- return [JSON.stringify(toLog)]
60
+ return [util.inspect(toLog, { compact: true, breakLength: Infinity, depth: null })]
61
61
  }
package/lib/log/index.js CHANGED
@@ -122,6 +122,10 @@ exports.Logger = (module, level) => {
122
122
  */
123
123
  exports.format = (
124
124
  process.env.NODE_ENV === 'production' && cds.env.features.kibana_formatter ? require('./format/kibana')
125
+ : cds.requires.multitenancy ? (module, level, ...args) => {
126
+ const t = cds.context?.tenant
127
+ return [ t ? `[${module}|${t}]` : `[${module}]`, '-', ...args ]
128
+ }
125
129
  : (module, level, ...args) => [ `[${module}] -`, ...args ]
126
130
  )
127
131
 
package/lib/ql/SELECT.js CHANGED
@@ -1,5 +1,5 @@
1
1
  const Whereable = require('./Whereable'), { parse, predicate4 } = Whereable
2
- const defaults = global.cds.env.sql
2
+ const cds = require('../index')
3
3
 
4
4
 
5
5
  module.exports = class SELECT extends Whereable {
@@ -120,13 +120,18 @@ module.exports = class SELECT extends Whereable {
120
120
  return this
121
121
  }
122
122
 
123
- forUpdate ({ of, wait = defaults.lock_acquire_timeout || -1 } = {}) {
123
+ forUpdate ({ of, wait = cds.env.sql.lock_acquire_timeout || -1 } = {}) {
124
124
  const sfu = this.SELECT.forUpdate = {}
125
125
  if (of) sfu.of = of.map (c => ({ref:c.split('.')}))
126
126
  if (wait >= 0) sfu.wait = wait
127
127
  return this
128
128
  }
129
129
 
130
+ forShareLock () {
131
+ this.SELECT.forShareLock = true
132
+ return this
133
+ }
134
+
130
135
  foreach (callback) {
131
136
  return this.then(rows => rows.map(callback))
132
137
  }
@@ -2,6 +2,11 @@ const { error } = require ('../index')
2
2
  const cds = require('../index')
3
3
  const parse = require('./parse')
4
4
 
5
+ const _setIncludesOr = where => {
6
+ if (where.includes('or')) Object.defineProperty(where,'_includes_or__',{value:1})
7
+ else Object.defineProperty(where,'_includes_or__',{value:0})
8
+ }
9
+
5
10
  class Whereable extends require('./Query') {
6
11
 
7
12
  where(...x) { return this._where (x,'and','where') }
@@ -20,11 +25,12 @@ class Whereable extends require('./Query') {
20
25
  if (_clause === 'on') _ = _.from
21
26
  let left = this._own(_clause,_)
22
27
  if (!left) {
23
- if (pred.includes('or')) Object.defineProperty(pred,'_includes_or__',{value:1})
28
+ _setIncludesOr(pred)
24
29
  _[_clause] = pred
25
30
  } else {
26
31
  if (and_or === 'and') {
27
- if (left._includes_or__) left = [{xpr:left}]
32
+ if (left._includes_or__ === undefined) _setIncludesOr(left) // information might be lost while copying
33
+ if (left._includes_or__ === 1) left = [{xpr:left}]
28
34
  if (pred.includes('or')) pred = [{xpr:pred}]
29
35
  }
30
36
  _[_clause] = [ ...left, and_or, ...pred ]
package/lib/ql/index.js CHANGED
@@ -23,9 +23,9 @@ function _deprecated_srv_ql() { // eslint-disable-next-line no-console
23
23
  }
24
24
 
25
25
  if (cds.env.features.cls && cds.env.features.debug_queries) {
26
- const Query = module.exports, { then } = Query.prototype
26
+ const Query = require('./Query'), { then } = Query.prototype
27
27
  const { AsyncResource } = require('async_hooks')
28
- Object.defineProperty (Query,'then',{ get(){
28
+ Object.defineProperty (Query.prototype,'then',{ get(){
29
29
  const q = new AsyncResource('cds.Query')
30
30
  return (r,e) => q.runInAsyncScope (then,this,r,e)
31
31
  }})