@sap/cds-dk 10.1.1 → 10.2.0

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 (870) hide show
  1. package/CHANGELOG.md +53 -0
  2. package/bin/add.js +7 -2
  3. package/bin/bind.js +0 -2
  4. package/bin/bindings.js +35 -0
  5. package/bin/build.js +11 -6
  6. package/bin/compile/index.js +1 -0
  7. package/bin/completion/index.js +10 -448
  8. package/bin/completion/scripts/cds.fish +24 -16
  9. package/bin/completion/scripts/cds.ps1 +26 -25
  10. package/bin/completion/scripts/cds.sh +22 -19
  11. package/bin/completion/scripts/cds.zsh +22 -19
  12. package/bin/deploy/index.js +1 -1
  13. package/bin/deploy/to-hana/hana.js +5 -4
  14. package/bin/env.js +0 -1
  15. package/bin/eval.js +9 -5
  16. package/bin/export.js +6 -4
  17. package/bin/help/export.md +28 -4
  18. package/bin/import.js +6 -5
  19. package/bin/inspect.js +0 -1
  20. package/bin/login.js +28 -3
  21. package/bin/repl.js +82 -26
  22. package/bin/run.js +6 -7
  23. package/bin/serve.js +6 -7
  24. package/bin/up.js +7 -2
  25. package/bin/upgrade/steps/install.js +6 -6
  26. package/bin/watch/index.js +1 -0
  27. package/lib/build/index.js +11 -7
  28. package/lib/build/plugins/featureToggles.js +2 -2
  29. package/lib/build/plugins/hana/index.js +1 -1
  30. package/lib/build/plugins/helm/files/subcharts/web-application/Chart.yaml +1 -1
  31. package/lib/build/plugins/helm/files/subcharts/web-application/templates/_helpers.tpl +7 -0
  32. package/lib/build/plugins/helm/files/subcharts/web-application/templates/api-rule.yaml +1 -0
  33. package/lib/build/plugins/helm/files/subcharts/web-application/templates/service-binding.yaml +4 -4
  34. package/lib/build/plugins/helm/files/subcharts/web-application/values.schema.json +13 -0
  35. package/lib/build/plugins/helm/files/subcharts/web-application/values.yaml +7 -1
  36. package/lib/build/plugins/internal.js +0 -26
  37. package/lib/build/plugins/java/index.js +5 -1
  38. package/lib/build/plugins/nodejs/index.js +13 -4
  39. package/lib/build/util.js +4 -5
  40. package/lib/cds.js +8 -2
  41. package/lib/env/schemas/cds-rc.js +5 -0
  42. package/lib/import/importapi.js +2 -3
  43. package/lib/init/constants.js +1 -1
  44. package/lib/init/index.js +8 -3
  45. package/lib/init/merge.js +21 -17
  46. package/lib/init/plugin.js +1 -1
  47. package/lib/init/projectReader.js +13 -10
  48. package/lib/init/registries/mta.js +0 -6
  49. package/lib/init/template/ai/index.js +4 -4
  50. package/lib/init/template/ams/files/extensionDeveloper.dcl +6 -0
  51. package/lib/init/template/ams/files/mta.yaml.hbs +6 -0
  52. package/lib/init/template/ams/files/sidecar.package.json.hbs +5 -0
  53. package/lib/init/template/ams/index.js +42 -40
  54. package/lib/init/template/app-frontend/files/mta.yaml.hbs +2 -0
  55. package/lib/init/template/app-frontend/files/ui5.yaml.hbs +0 -4
  56. package/lib/init/template/app-frontend/index.js +29 -24
  57. package/lib/init/template/application-logging/index.js +6 -6
  58. package/lib/init/template/approuter/files/xs-app.json.hbs +22 -0
  59. package/lib/init/template/approuter/index.js +20 -13
  60. package/lib/init/template/attachments/index.js +3 -3
  61. package/lib/init/template/audit-logging/index.js +4 -4
  62. package/lib/init/template/cloud-logging/index.js +12 -6
  63. package/lib/init/template/completion/completionSetup.js +19 -6
  64. package/lib/init/template/connectivity/index.js +3 -3
  65. package/lib/init/template/data/as-csv.js +7 -4
  66. package/lib/init/template/data/as-json.js +77 -20
  67. package/lib/init/template/destination/index.js +12 -9
  68. package/lib/init/template/dynatrace/index.js +5 -5
  69. package/lib/init/template/enterprise-messaging/index.js +10 -7
  70. package/lib/init/template/enterprise-messaging-shared/index.js +4 -4
  71. package/lib/init/template/event-mesh/index.js +3 -0
  72. package/lib/init/template/extensibility/index.js +2 -2
  73. package/lib/init/template/extension/index.js +26 -0
  74. package/lib/init/template/github-actions/index.js +3 -3
  75. package/lib/init/template/hana/files/package.json.hbs +3 -2
  76. package/lib/init/template/hana/index.js +5 -5
  77. package/lib/init/template/hana-serverless/index.js +3 -3
  78. package/lib/init/template/html5-repo/files/mta.yaml.hbs +2 -0
  79. package/lib/init/template/html5-repo/files/ui5.yaml.hbs +0 -4
  80. package/lib/init/template/html5-repo/index.js +68 -40
  81. package/lib/init/template/http/index.js +1 -1
  82. package/lib/init/template/ias/index.js +7 -7
  83. package/lib/init/template/initial/files/.gitignore.hbs +1 -0
  84. package/lib/init/template/kafka/index.js +3 -3
  85. package/lib/init/template/kyma/index.js +7 -9
  86. package/lib/init/template/malware-scanner/index.js +3 -3
  87. package/lib/init/template/mta/index.js +6 -3
  88. package/lib/init/template/multitenancy/index.js +6 -7
  89. package/lib/init/template/notifications/index.js +2 -2
  90. package/lib/init/template/portal/index.js +16 -10
  91. package/lib/init/template/postgres/index.js +5 -5
  92. package/lib/init/template/react/files/index.html.hbs +1 -1
  93. package/lib/init/template/react/files/package.json.hbs +3 -2
  94. package/lib/init/template/react/files/src/{App.jsx.hbs → App.{{jsxExtension}}.hbs} +8 -2
  95. package/lib/init/template/react/files/src/{main.jsx → main.{{jsxExtension}}.hbs} +2 -2
  96. package/lib/init/template/react/index.js +23 -4
  97. package/lib/init/template/react/typescript/src/vite-env.d.ts +1 -0
  98. package/lib/init/template/react/typescript/tsconfig.json.hbs +16 -0
  99. package/lib/init/template/redis/index.js +2 -2
  100. package/lib/init/template/side-by-side-extensibility/index.js +6 -3
  101. package/lib/init/template/typescript/files/tsconfig.json +3 -1
  102. package/lib/init/template/vue/files/index.html.hbs +1 -1
  103. package/lib/init/template/vue/files/package.json.hbs +2 -1
  104. package/lib/init/template/vue/files/src/App.vue.hbs +8 -2
  105. package/lib/init/template/vue/index.js +20 -4
  106. package/lib/init/template/vue/typescript/tsconfig.json +11 -0
  107. package/lib/init/template/workzone-standard/files/mta.yaml.hbs +2 -2
  108. package/lib/init/template/workzone-standard/index.js +30 -28
  109. package/lib/init/template/xsuaa/files/mta.yaml.hbs +1 -1
  110. package/lib/init/template/xsuaa/files/values.yaml.hbs +1 -1
  111. package/lib/init/template/xsuaa/index.js +34 -22
  112. package/lib/mtx/auth_manager.js +8 -2
  113. package/lib/mtx/browser_login.js +181 -0
  114. package/lib/mtx/params.js +6 -0
  115. package/lib/mtx/settings_manager.js +29 -4
  116. package/lib/util/cf.js +44 -8
  117. package/lib/util/fs.js +2 -2
  118. package/node_modules/@cap-js/db-service/CHANGELOG.md +23 -0
  119. package/node_modules/@cap-js/db-service/lib/cqn2pql.js +4 -0
  120. package/node_modules/@cap-js/db-service/lib/cqn2sql.js +3 -0
  121. package/node_modules/@cap-js/db-service/lib/cqn4sql.js +17 -28
  122. package/node_modules/@cap-js/db-service/lib/infer/index.js +20 -27
  123. package/node_modules/@cap-js/db-service/package.json +1 -1
  124. package/node_modules/@cap-js/openapi/cds-plugin.js +12 -0
  125. package/node_modules/@cap-js/openapi/index.js +3 -1
  126. package/node_modules/@cap-js/openapi/lib/compile/csdl2openapi.js +652 -413
  127. package/node_modules/@cap-js/openapi/lib/compile/diagram.js +16 -13
  128. package/node_modules/@cap-js/openapi/lib/compile/index.js +10 -7
  129. package/node_modules/@cap-js/openapi/lib/compile/property-util.js +51 -0
  130. package/{lib/import/openapi → node_modules/@cap-js/openapi/lib/import}/importOpenAPI.js +12 -9
  131. package/{lib/import/openapi → node_modules/@cap-js/openapi/lib/import}/index.js +4 -3
  132. package/node_modules/@cap-js/openapi/package.json +71 -3
  133. package/node_modules/@cap-js/sqlite/CHANGELOG.md +18 -0
  134. package/node_modules/@cap-js/sqlite/package.json +3 -3
  135. package/node_modules/@isaacs/fs-minipass/LICENSE +15 -0
  136. package/node_modules/@isaacs/fs-minipass/README.md +71 -0
  137. package/node_modules/@isaacs/fs-minipass/dist/commonjs/index.d.ts +118 -0
  138. package/node_modules/@isaacs/fs-minipass/dist/commonjs/index.d.ts.map +1 -0
  139. package/node_modules/@isaacs/fs-minipass/dist/commonjs/index.js +430 -0
  140. package/node_modules/@isaacs/fs-minipass/dist/commonjs/index.js.map +1 -0
  141. package/node_modules/@isaacs/fs-minipass/dist/commonjs/package.json +3 -0
  142. package/node_modules/@isaacs/fs-minipass/dist/esm/index.d.ts +118 -0
  143. package/node_modules/@isaacs/fs-minipass/dist/esm/index.d.ts.map +1 -0
  144. package/node_modules/@isaacs/fs-minipass/dist/esm/index.js +420 -0
  145. package/node_modules/@isaacs/fs-minipass/dist/esm/index.js.map +1 -0
  146. package/node_modules/@isaacs/fs-minipass/dist/esm/package.json +3 -0
  147. package/node_modules/@isaacs/fs-minipass/package.json +72 -0
  148. package/node_modules/@sap/cds/CHANGELOG.md +71 -1
  149. package/node_modules/@sap/cds/_i18n/messages_ar.properties +1 -0
  150. package/node_modules/@sap/cds/_i18n/messages_bg.properties +1 -0
  151. package/node_modules/@sap/cds/_i18n/messages_cs.properties +1 -0
  152. package/node_modules/@sap/cds/_i18n/messages_da.properties +1 -0
  153. package/node_modules/@sap/cds/_i18n/messages_de.properties +1 -0
  154. package/node_modules/@sap/cds/_i18n/messages_el.properties +1 -0
  155. package/node_modules/@sap/cds/_i18n/messages_en.properties +1 -0
  156. package/node_modules/@sap/cds/_i18n/messages_es.properties +1 -0
  157. package/node_modules/@sap/cds/_i18n/messages_es_MX.properties +1 -0
  158. package/node_modules/@sap/cds/_i18n/messages_fi.properties +1 -0
  159. package/node_modules/@sap/cds/_i18n/messages_fr.properties +1 -0
  160. package/node_modules/@sap/cds/_i18n/messages_he.properties +1 -0
  161. package/node_modules/@sap/cds/_i18n/messages_hr.properties +1 -0
  162. package/node_modules/@sap/cds/_i18n/messages_hu.properties +1 -0
  163. package/node_modules/@sap/cds/_i18n/messages_it.properties +1 -0
  164. package/node_modules/@sap/cds/_i18n/messages_ja.properties +1 -0
  165. package/node_modules/@sap/cds/_i18n/messages_kk.properties +1 -0
  166. package/node_modules/@sap/cds/_i18n/messages_ko.properties +1 -0
  167. package/node_modules/@sap/cds/_i18n/messages_ms.properties +1 -0
  168. package/node_modules/@sap/cds/_i18n/messages_nl.properties +1 -0
  169. package/node_modules/@sap/cds/_i18n/messages_no.properties +1 -0
  170. package/node_modules/@sap/cds/_i18n/messages_pl.properties +1 -0
  171. package/node_modules/@sap/cds/_i18n/messages_pt.properties +1 -0
  172. package/node_modules/@sap/cds/_i18n/messages_ro.properties +1 -0
  173. package/node_modules/@sap/cds/_i18n/messages_ru.properties +1 -0
  174. package/node_modules/@sap/cds/_i18n/messages_sh.properties +1 -0
  175. package/node_modules/@sap/cds/_i18n/messages_sk.properties +1 -0
  176. package/node_modules/@sap/cds/_i18n/messages_sl.properties +1 -0
  177. package/node_modules/@sap/cds/_i18n/messages_sv.properties +1 -0
  178. package/node_modules/@sap/cds/_i18n/messages_th.properties +1 -0
  179. package/node_modules/@sap/cds/_i18n/messages_tr.properties +1 -0
  180. package/node_modules/@sap/cds/_i18n/messages_uk.properties +1 -0
  181. package/node_modules/@sap/cds/_i18n/messages_vi.properties +1 -0
  182. package/node_modules/@sap/cds/_i18n/messages_zh_CN.properties +1 -0
  183. package/node_modules/@sap/cds/_i18n/messages_zh_TW.properties +1 -0
  184. package/node_modules/@sap/cds/app/index-client.js +164 -0
  185. package/node_modules/@sap/cds/app/index.css +598 -87
  186. package/node_modules/@sap/cds/app/index.html +54 -30
  187. package/node_modules/@sap/cds/app/index.js +311 -67
  188. package/node_modules/@sap/cds/app/table.html +226 -0
  189. package/node_modules/@sap/cds/app/table.js +302 -0
  190. package/node_modules/@sap/cds/bin/serve.js +3 -2
  191. package/node_modules/@sap/cds/common.cds +3 -3
  192. package/node_modules/@sap/cds/eslint.config.mjs +2 -0
  193. package/node_modules/@sap/cds/lib/compile/cdsc.js +7 -0
  194. package/node_modules/@sap/cds/lib/compile/for/embeddings.js +27 -0
  195. package/node_modules/@sap/cds/lib/compile/load.js +2 -2
  196. package/node_modules/@sap/cds/lib/compile/minify.js +17 -2
  197. package/node_modules/@sap/cds/lib/compile/parse.js +3 -0
  198. package/node_modules/@sap/cds/lib/compile/resolve.js +16 -14
  199. package/node_modules/@sap/cds/lib/core/classes.js +1 -0
  200. package/node_modules/@sap/cds/lib/dbs/cds-deploy.js +4 -5
  201. package/node_modules/@sap/cds/lib/env/cds-env.js +132 -70
  202. package/node_modules/@sap/cds/lib/env/cds-requires/auth-strategies.js +62 -0
  203. package/node_modules/@sap/cds/lib/env/cds-requires/databases.js +49 -0
  204. package/node_modules/@sap/cds/lib/env/cds-requires/embeddings.js +8 -0
  205. package/node_modules/@sap/cds/lib/env/cds-requires/index.js +27 -0
  206. package/node_modules/@sap/cds/lib/env/cds-requires/messaging.js +82 -0
  207. package/node_modules/@sap/cds/lib/env/cds-requires/platform.js +23 -0
  208. package/node_modules/@sap/cds/lib/env/cds-requires/queues.js +34 -0
  209. package/node_modules/@sap/cds/lib/env/cds-requires/services.js +32 -0
  210. package/node_modules/@sap/cds/lib/env/defaults.js +9 -1
  211. package/node_modules/@sap/cds/lib/i18n/files.js +4 -4
  212. package/node_modules/@sap/cds/lib/i18n/locale.js +1 -1
  213. package/node_modules/@sap/cds/lib/index.js +9 -9
  214. package/node_modules/@sap/cds/lib/log/cds-log.js +3 -3
  215. package/node_modules/@sap/cds/lib/ql/SELECT.js +2 -0
  216. package/node_modules/@sap/cds/lib/ql/UPDATE.js +1 -1
  217. package/node_modules/@sap/cds/lib/ql/cds.ql-Query.js +4 -1
  218. package/node_modules/@sap/cds/lib/ql/core/@types/cqn.d.ts +146 -0
  219. package/node_modules/@sap/cds/lib/ql/core/@types/exprs.d.ts +51 -0
  220. package/node_modules/@sap/cds/lib/ql/core/@types/index.d.ts +29 -0
  221. package/node_modules/@sap/cds/lib/ql/core/@types/package.json +7 -0
  222. package/node_modules/@sap/cds/lib/ql/core/@types/ql/delete.d.ts +8 -0
  223. package/node_modules/@sap/cds/lib/ql/core/@types/ql/insert.d.ts +19 -0
  224. package/node_modules/@sap/cds/lib/ql/core/@types/ql/select.d.ts +24 -0
  225. package/node_modules/@sap/cds/lib/ql/core/@types/ql/update.d.ts +10 -0
  226. package/node_modules/@sap/cds/lib/ql/core/@types/query.d.ts +18 -0
  227. package/node_modules/@sap/cds/lib/ql/core/cql/parser.min.js +1 -0
  228. package/node_modules/@sap/cds/lib/ql/core/lib/index.js +69 -0
  229. package/node_modules/@sap/cds/lib/ql/core/lib/ql/cache.js +34 -0
  230. package/node_modules/@sap/cds/lib/ql/core/lib/ql/call-action.js +6 -0
  231. package/node_modules/@sap/cds/lib/ql/core/lib/ql/delete.js +8 -0
  232. package/node_modules/@sap/cds/lib/ql/core/lib/ql/insert.js +26 -0
  233. package/node_modules/@sap/cds/lib/ql/core/lib/ql/select.js +22 -0
  234. package/node_modules/@sap/cds/lib/ql/core/lib/ql/update.js +26 -0
  235. package/node_modules/@sap/cds/lib/ql/core/lib/query.js +85 -0
  236. package/node_modules/@sap/cds/lib/ql/core/lib/xl/fluent.js +47 -0
  237. package/node_modules/@sap/cds/lib/ql/core/lib/xl/ttl.js +24 -0
  238. package/node_modules/@sap/cds/lib/ql/core/license +201 -0
  239. package/node_modules/@sap/cds/lib/ql/core/package.json +24 -0
  240. package/node_modules/@sap/cds/lib/ql/core/readme.md +99 -0
  241. package/node_modules/@sap/cds/lib/ql/core/upstream.json +5 -0
  242. package/node_modules/@sap/cds/lib/req/spawn.js +1 -1
  243. package/node_modules/@sap/cds/lib/srv/bindings.js +111 -115
  244. package/node_modules/@sap/cds/lib/srv/cds-connect.js +11 -10
  245. package/node_modules/@sap/cds/lib/srv/cds-serve.js +16 -7
  246. package/node_modules/@sap/cds/lib/srv/cds.Service.js +13 -7
  247. package/node_modules/@sap/cds/lib/srv/factory.js +8 -10
  248. package/node_modules/@sap/cds/lib/srv/middlewares/auth/ias-auth.js +35 -32
  249. package/node_modules/@sap/cds/lib/srv/middlewares/auth/jwt-auth.js +5 -1
  250. package/node_modules/@sap/cds/lib/srv/middlewares/auth/mocked-users.js +1 -1
  251. package/node_modules/@sap/cds/lib/srv/protocols/hcql.js +230 -79
  252. package/node_modules/@sap/cds/lib/srv/protocols/http.js +7 -3
  253. package/node_modules/@sap/cds/lib/srv/protocols/index.js +7 -2
  254. package/node_modules/@sap/cds/lib/srv/srv-dispatch.js +2 -2
  255. package/node_modules/@sap/cds/lib/utils/cds-utils.js +37 -0
  256. package/node_modules/@sap/cds/lib/utils/csv-reader.js +2 -2
  257. package/node_modules/@sap/cds/libx/_runtime/common/generic/assert.js +18 -27
  258. package/node_modules/@sap/cds/libx/_runtime/common/generic/crud.js +8 -2
  259. package/node_modules/@sap/cds/libx/_runtime/common/utils/cqn.js +1 -1
  260. package/node_modules/@sap/cds/libx/_runtime/common/utils/rewriteAsterisks.js +1 -1
  261. package/node_modules/@sap/cds/libx/_runtime/fiori/lean-draft.js +122 -85
  262. package/node_modules/@sap/cds/libx/_runtime/messaging/common-utils/authorizedRequest.js +24 -1
  263. package/node_modules/@sap/cds/libx/_runtime/messaging/common-utils/normalizeIncomingMessage.js +1 -1
  264. package/node_modules/@sap/cds/libx/_runtime/messaging/kafka.js +1 -1
  265. package/node_modules/@sap/cds/libx/_runtime/remote/Service.js +2 -2
  266. package/node_modules/@sap/cds/libx/_runtime/remote/utils/client.js +3 -2
  267. package/node_modules/@sap/cds/libx/_runtime/remote/utils/query.js +11 -6
  268. package/node_modules/@sap/cds/libx/http/location.js +10 -11
  269. package/node_modules/@sap/cds/libx/odata/middleware/create.js +4 -0
  270. package/node_modules/@sap/cds/libx/odata/middleware/metadata.js +1 -1
  271. package/node_modules/@sap/cds/libx/odata/middleware/operation.js +3 -0
  272. package/node_modules/@sap/cds/libx/odata/middleware/parse.js +9 -0
  273. package/node_modules/@sap/cds/libx/odata/middleware/read.js +7 -1
  274. package/node_modules/@sap/cds/libx/odata/middleware/update.js +5 -1
  275. package/node_modules/@sap/cds/libx/odata/parse/afterburner.js +3 -3
  276. package/node_modules/@sap/cds/libx/odata/parse/multipartToJson.js +1 -1
  277. package/node_modules/@sap/cds/libx/odata/utils/ieee754.js +20 -0
  278. package/node_modules/@sap/cds/libx/queue/SchedulingService.js +4 -0
  279. package/node_modules/@sap/cds/libx/queue/api.js +1 -1
  280. package/node_modules/@sap/cds/libx/queue/index.js +46 -10
  281. package/node_modules/@sap/cds/libx/queue/processing.js +52 -16
  282. package/node_modules/@sap/cds/libx/queue/utils.js +3 -0
  283. package/node_modules/@sap/cds/libx/rest/RestAdapter.js +1 -0
  284. package/node_modules/@sap/cds/package.json +2 -2
  285. package/node_modules/@sap/cds/server.js +1 -0
  286. package/node_modules/@sap/cds/srv/ucl-service.cds +1 -0
  287. package/node_modules/@sap/cds/tasks/enterprise-messaging-deploy.js +13 -5
  288. package/node_modules/@sap/cds-compiler/CHANGELOG.md +83 -0
  289. package/node_modules/@sap/cds-compiler/bin/cdsse.js +1 -1
  290. package/node_modules/@sap/cds-compiler/doc/EffectiveCSN.md +3314 -0
  291. package/node_modules/@sap/cds-compiler/lib/api/main.js +9 -6
  292. package/node_modules/@sap/cds-compiler/lib/api/options.js +3 -3
  293. package/node_modules/@sap/cds-compiler/lib/{model → base}/csnUtils.js +5 -5
  294. package/node_modules/@sap/cds-compiler/lib/base/message-registry.js +54 -6
  295. package/node_modules/@sap/cds-compiler/lib/base/optionProcessor.js +4 -4
  296. package/node_modules/@sap/cds-compiler/lib/{model → base}/sortViews.js +1 -1
  297. package/node_modules/@sap/cds-compiler/lib/checks/assocOutsideService.js +1 -1
  298. package/node_modules/@sap/cds-compiler/lib/checks/checkForTypes.js +1 -1
  299. package/node_modules/@sap/cds-compiler/lib/checks/checkPathsInStoredCalcElement.js +1 -1
  300. package/node_modules/@sap/cds-compiler/lib/checks/elements.js +37 -3
  301. package/node_modules/@sap/cds-compiler/lib/checks/enricher.js +1 -1
  302. package/node_modules/@sap/cds-compiler/lib/checks/existsInForbiddenPlaces.js +1 -1
  303. package/node_modules/@sap/cds-compiler/lib/checks/hasPersistedElements.js +1 -1
  304. package/node_modules/@sap/cds-compiler/lib/checks/manyExpand.js +1 -1
  305. package/node_modules/@sap/cds-compiler/lib/checks/manyNavigations.js +1 -1
  306. package/node_modules/@sap/cds-compiler/lib/checks/onConditions.js +1 -1
  307. package/node_modules/@sap/cds-compiler/lib/checks/parameters.js +1 -1
  308. package/node_modules/@sap/cds-compiler/lib/checks/queryNoDbArtifacts.js +1 -1
  309. package/node_modules/@sap/cds-compiler/lib/checks/selectItems.js +1 -1
  310. package/node_modules/@sap/cds-compiler/lib/checks/structuredAnnoExpressions.js +1 -1
  311. package/node_modules/@sap/cds-compiler/lib/checks/typeParameters.js +1 -1
  312. package/node_modules/@sap/cds-compiler/lib/checks/types.js +1 -1
  313. package/node_modules/@sap/cds-compiler/lib/checks/validator.js +1 -1
  314. package/node_modules/@sap/cds-compiler/lib/compiler/assert-consistency.js +20 -12
  315. package/node_modules/@sap/cds-compiler/lib/compiler/builtins.js +9 -4
  316. package/node_modules/@sap/cds-compiler/lib/compiler/checks.js +50 -0
  317. package/node_modules/@sap/cds-compiler/lib/compiler/define.js +303 -323
  318. package/node_modules/@sap/cds-compiler/lib/compiler/dictionaries.js +5 -0
  319. package/node_modules/@sap/cds-compiler/lib/compiler/extend.js +1015 -1177
  320. package/node_modules/@sap/cds-compiler/lib/compiler/generate.js +55 -42
  321. package/node_modules/@sap/cds-compiler/lib/compiler/populate.js +74 -45
  322. package/node_modules/@sap/cds-compiler/lib/compiler/propagator.js +1 -0
  323. package/node_modules/@sap/cds-compiler/lib/compiler/resolve.js +6 -4
  324. package/node_modules/@sap/cds-compiler/lib/compiler/shared.js +30 -49
  325. package/node_modules/@sap/cds-compiler/lib/compiler/utils.js +32 -18
  326. package/node_modules/@sap/cds-compiler/lib/edm/annotations/edmJson.js +3 -3
  327. package/node_modules/@sap/cds-compiler/lib/edm/annotations/genericTranslation.js +2 -2
  328. package/node_modules/@sap/cds-compiler/lib/edm/annotations/preprocessAnnotations.js +2 -3
  329. package/node_modules/@sap/cds-compiler/lib/edm/csn2edm.js +1 -1
  330. package/node_modules/@sap/cds-compiler/lib/edm/edm.js +6 -7
  331. package/node_modules/@sap/cds-compiler/lib/edm/edmAnnoPreprocessor.js +1 -1
  332. package/node_modules/@sap/cds-compiler/lib/edm/edmInboundChecks.js +1 -1
  333. package/node_modules/@sap/cds-compiler/lib/edm/edmPreprocessor.js +1 -1
  334. package/node_modules/@sap/cds-compiler/lib/edm/edmUtils.js +12 -7
  335. package/node_modules/@sap/cds-compiler/lib/gen/CdlGrammar.checksum +1 -1
  336. package/node_modules/@sap/cds-compiler/lib/gen/CdlParser.js +15 -15
  337. package/node_modules/@sap/cds-compiler/lib/gen/Dictionary.json +7 -0
  338. package/node_modules/@sap/cds-compiler/lib/json/from-csn.js +30 -30
  339. package/node_modules/@sap/cds-compiler/lib/json/to-csn.js +2 -1
  340. package/node_modules/@sap/cds-compiler/lib/main.js +4 -1
  341. package/node_modules/@sap/cds-compiler/lib/parsers/AstBuildingParser.js +42 -15
  342. package/node_modules/@sap/cds-compiler/lib/render/DuplicateChecker.js +37 -11
  343. package/node_modules/@sap/cds-compiler/lib/render/manageConstraints.js +1 -1
  344. package/node_modules/@sap/cds-compiler/lib/render/toCdl.js +11 -6
  345. package/node_modules/@sap/cds-compiler/lib/render/toRename.js +1 -1
  346. package/node_modules/@sap/cds-compiler/lib/render/toSql.js +74 -24
  347. package/node_modules/@sap/cds-compiler/lib/render/utils/common.js +1 -1
  348. package/node_modules/@sap/cds-compiler/lib/render/utils/operators.js +81 -0
  349. package/node_modules/@sap/cds-compiler/lib/render/utils/sql.js +17 -10
  350. package/node_modules/@sap/cds-compiler/lib/transform/db/assertUnique.js +1 -1
  351. package/node_modules/@sap/cds-compiler/lib/transform/db/associations.js +3 -4
  352. package/node_modules/@sap/cds-compiler/lib/transform/db/assocsToQueries/transformExists.js +1 -1
  353. package/node_modules/@sap/cds-compiler/lib/transform/db/backlinks.js +2 -2
  354. package/node_modules/@sap/cds-compiler/lib/transform/db/cdsPersistence.js +1 -1
  355. package/node_modules/@sap/cds-compiler/lib/transform/db/constraints.js +6 -5
  356. package/node_modules/@sap/cds-compiler/lib/transform/db/expansion.js +7 -1
  357. package/node_modules/@sap/cds-compiler/lib/transform/db/flattening.js +2 -2
  358. package/node_modules/@sap/cds-compiler/lib/{modelCompare/compare.js → transform/db/migration/diffModels.js} +5 -5
  359. package/node_modules/@sap/cds-compiler/lib/{modelCompare/utils/filter.js → transform/db/migration/filterDiff.js} +2 -2
  360. package/node_modules/@sap/cds-compiler/lib/transform/db/processSqlServices.js +1 -1
  361. package/node_modules/@sap/cds-compiler/lib/transform/db/rewriteCalculatedElements.js +1 -1
  362. package/node_modules/@sap/cds-compiler/lib/transform/db/temporal.js +1 -1
  363. package/node_modules/@sap/cds-compiler/lib/transform/db/views.js +2 -6
  364. package/node_modules/@sap/cds-compiler/lib/transform/draft/db.js +1 -1
  365. package/node_modules/@sap/cds-compiler/lib/transform/draft/odata.js +1 -1
  366. package/node_modules/@sap/cds-compiler/lib/transform/effective/annotations.js +1 -1
  367. package/node_modules/@sap/cds-compiler/lib/transform/effective/associations.js +1 -1
  368. package/node_modules/@sap/cds-compiler/lib/transform/effective/flattening.js +1 -1
  369. package/node_modules/@sap/cds-compiler/lib/transform/effective/main.js +3 -2
  370. package/node_modules/@sap/cds-compiler/lib/transform/effective/misc.js +2 -1
  371. package/node_modules/@sap/cds-compiler/lib/transform/effective/queries.js +1 -1
  372. package/node_modules/@sap/cds-compiler/lib/transform/effective/types.js +1 -1
  373. package/node_modules/@sap/cds-compiler/lib/transform/forOdata.js +1 -1
  374. package/node_modules/@sap/cds-compiler/lib/transform/forRelationalDB.js +9 -4
  375. package/node_modules/@sap/cds-compiler/lib/transform/localized.js +1 -1
  376. package/node_modules/@sap/cds-compiler/lib/transform/odata/adaptAnnotationRefs.js +5 -11
  377. package/node_modules/@sap/cds-compiler/lib/transform/odata/createForeignKeys.js +1 -1
  378. package/node_modules/@sap/cds-compiler/lib/transform/odata/flattening.js +4 -4
  379. package/node_modules/@sap/cds-compiler/lib/transform/odata/foreignKeyRefsInXprAnnos.js +5 -3
  380. package/node_modules/@sap/cds-compiler/lib/transform/odata/toFinalBaseType.js +29 -5
  381. package/node_modules/@sap/cds-compiler/lib/transform/odata/typesExposure.js +13 -3
  382. package/node_modules/@sap/cds-compiler/lib/transform/odata/utils.js +9 -0
  383. package/node_modules/@sap/cds-compiler/lib/transform/transformUtils.js +2 -2
  384. package/node_modules/@sap/cds-compiler/lib/transform/translateAssocsToJoins.js +1 -1
  385. package/node_modules/@sap/cds-compiler/lib/transform/tupleExpansion.js +1 -1
  386. package/node_modules/@sap/cds-compiler/lib/transform/universalCsn/coreComputed.js +1 -1
  387. package/node_modules/@sap/cds-compiler/lib/transform/universalCsn/universalCsnEnricher.js +1 -1
  388. package/node_modules/@sap/cds-compiler/lib/transform/universalCsn/utils.js +1 -1
  389. package/node_modules/@sap/cds-compiler/package.json +1 -1
  390. package/node_modules/@sap/cds-mtxs/CHANGELOG.md +47 -0
  391. package/node_modules/@sap/cds-mtxs/bin/cds-mtx-migrate.js +4 -6
  392. package/node_modules/@sap/cds-mtxs/bin/cds-mtx.js +5 -4
  393. package/node_modules/@sap/cds-mtxs/cds-plugin.js +38 -2
  394. package/node_modules/@sap/cds-mtxs/db/t0.cds +7 -0
  395. package/node_modules/@sap/cds-mtxs/lib/utils.js +129 -20
  396. package/node_modules/@sap/cds-mtxs/package.json +15 -14
  397. package/node_modules/@sap/cds-mtxs/srv/cf/abstract-provisioning-service.js +13 -12
  398. package/node_modules/@sap/cds-mtxs/srv/cf/saas-provisioning-service.cds +1 -0
  399. package/node_modules/@sap/cds-mtxs/srv/cf/sms-provisioning-service.cds +1 -0
  400. package/node_modules/@sap/cds-mtxs/srv/extensibility/compat/update.js +5 -2
  401. package/node_modules/@sap/cds-mtxs/srv/extensibility/linter/config.js +1 -2
  402. package/node_modules/@sap/cds-mtxs/srv/extensibility/linter/csv-allowlist.js +64 -0
  403. package/node_modules/@sap/cds-mtxs/srv/extensibility/linter/index.js +4 -2
  404. package/node_modules/@sap/cds-mtxs/srv/extensibility/linter/protected-namespace.js +67 -5
  405. package/node_modules/@sap/cds-mtxs/srv/extensibility-service.js +179 -15
  406. package/node_modules/@sap/cds-mtxs/srv/jobs-service.js +12 -3
  407. package/node_modules/@sap/cds-mtxs/srv/plugins/common.js +33 -12
  408. package/node_modules/@sap/cds-mtxs/srv/plugins/hana/ctnr-mgr-base.js +24 -6
  409. package/node_modules/@sap/cds-mtxs/srv/plugins/hana/hdi-ctnr-mgr.js +3 -1
  410. package/node_modules/@sap/cds-mtxs/srv/plugins/hana/hdi-native.js +752 -0
  411. package/node_modules/@sap/cds-mtxs/srv/plugins/hana/serverless.js +17 -20
  412. package/node_modules/@sap/cds-mtxs/srv/plugins/hana/srv-mgr-v2.js +511 -0
  413. package/node_modules/@sap/cds-mtxs/srv/plugins/hana/srv-mgr.js +11 -4
  414. package/node_modules/@sap/cds-mtxs/srv/plugins/hana/tms.js +8 -0
  415. package/node_modules/@sap/cds-mtxs/srv/plugins/hana.js +27 -18
  416. package/node_modules/@sap/cds-mtxs/srv/worker/job-worker-pool.js +1 -1
  417. package/node_modules/@sap/cds-mtxs/srv/worker/job-worker.js +1 -1
  418. package/node_modules/chownr/LICENSE.md +63 -0
  419. package/node_modules/chownr/README.md +3 -0
  420. package/node_modules/chownr/dist/commonjs/index.d.ts +3 -0
  421. package/node_modules/chownr/dist/commonjs/index.d.ts.map +1 -0
  422. package/node_modules/chownr/dist/commonjs/index.js +93 -0
  423. package/node_modules/chownr/dist/commonjs/index.js.map +1 -0
  424. package/node_modules/chownr/dist/commonjs/package.json +3 -0
  425. package/node_modules/chownr/dist/esm/index.d.ts +3 -0
  426. package/node_modules/chownr/dist/esm/index.d.ts.map +1 -0
  427. package/node_modules/chownr/dist/esm/index.js +85 -0
  428. package/node_modules/chownr/dist/esm/index.js.map +1 -0
  429. package/node_modules/chownr/dist/esm/package.json +3 -0
  430. package/node_modules/chownr/package.json +69 -0
  431. package/node_modules/content-disposition/README.md +105 -35
  432. package/node_modules/content-disposition/dist/index.d.ts +72 -0
  433. package/node_modules/content-disposition/dist/index.js +388 -0
  434. package/node_modules/content-disposition/dist/index.js.map +1 -0
  435. package/node_modules/content-disposition/package.json +31 -19
  436. package/node_modules/content-type/README.md +34 -57
  437. package/node_modules/content-type/package.json +35 -25
  438. package/node_modules/express/Readme.md +15 -9
  439. package/node_modules/express/lib/application.js +2 -2
  440. package/node_modules/express/lib/request.js +32 -19
  441. package/node_modules/express/lib/response.js +27 -30
  442. package/node_modules/express/package.json +10 -10
  443. package/node_modules/handlebars/bin/handlebars +1 -1
  444. package/node_modules/handlebars/dist/amd/handlebars/base.js +2 -2
  445. package/node_modules/handlebars/dist/amd/handlebars/compiler/base.js +2 -59
  446. package/node_modules/handlebars/dist/amd/handlebars/compiler/code-gen.js +68 -5
  447. package/node_modules/handlebars/dist/amd/handlebars/compiler/compiler.js +160 -19
  448. package/node_modules/handlebars/dist/amd/handlebars/compiler/javascript-compiler.js +23 -7
  449. package/node_modules/handlebars/dist/amd/handlebars/compiler/node-types.js +12 -0
  450. package/node_modules/handlebars/dist/amd/handlebars/compiler/visitor.js +26 -7
  451. package/node_modules/handlebars/dist/amd/handlebars/compiler/whitespace-control.js +9 -4
  452. package/node_modules/handlebars/dist/amd/handlebars/exception.js +8 -4
  453. package/node_modules/handlebars/dist/amd/handlebars/helpers/each.js +40 -14
  454. package/node_modules/handlebars/dist/amd/handlebars/internal/proto-access.js +21 -1
  455. package/node_modules/handlebars/dist/amd/handlebars/runtime.js +24 -4
  456. package/node_modules/handlebars/dist/amd/handlebars/utils.js +4 -3
  457. package/node_modules/handlebars/dist/amd/precompiler.js +13 -7
  458. package/node_modules/handlebars/dist/cjs/handlebars/base.js +2 -2
  459. package/node_modules/handlebars/dist/cjs/handlebars/compiler/base.js +1 -60
  460. package/node_modules/handlebars/dist/cjs/handlebars/compiler/code-gen.js +64 -4
  461. package/node_modules/handlebars/dist/cjs/handlebars/compiler/compiler.js +161 -18
  462. package/node_modules/handlebars/dist/cjs/handlebars/compiler/javascript-compiler.js +23 -7
  463. package/node_modules/handlebars/dist/cjs/handlebars/compiler/node-types.js +10 -0
  464. package/node_modules/handlebars/dist/cjs/handlebars/compiler/visitor.js +29 -6
  465. package/node_modules/handlebars/dist/cjs/handlebars/compiler/whitespace-control.js +9 -4
  466. package/node_modules/handlebars/dist/cjs/handlebars/exception.js +8 -4
  467. package/node_modules/handlebars/dist/cjs/handlebars/helpers/each.js +40 -14
  468. package/node_modules/handlebars/dist/cjs/handlebars/internal/proto-access.js +21 -1
  469. package/node_modules/handlebars/dist/cjs/handlebars/runtime.js +24 -4
  470. package/node_modules/handlebars/dist/cjs/handlebars/utils.js +4 -3
  471. package/node_modules/handlebars/dist/cjs/precompiler.js +14 -6
  472. package/node_modules/handlebars/dist/handlebars.amd.js +401 -130
  473. package/node_modules/handlebars/dist/handlebars.amd.min.js +4 -4
  474. package/node_modules/handlebars/dist/handlebars.js +396 -125
  475. package/node_modules/handlebars/dist/handlebars.min.js +4 -4
  476. package/node_modules/handlebars/dist/handlebars.runtime.amd.js +100 -29
  477. package/node_modules/handlebars/dist/handlebars.runtime.amd.min.js +2 -2
  478. package/node_modules/handlebars/dist/handlebars.runtime.js +94 -23
  479. package/node_modules/handlebars/dist/handlebars.runtime.min.js +2 -2
  480. package/node_modules/handlebars/lib/handlebars/base.js +1 -1
  481. package/node_modules/handlebars/lib/handlebars/compiler/base.js +0 -67
  482. package/node_modules/handlebars/lib/handlebars/compiler/code-gen.js +65 -11
  483. package/node_modules/handlebars/lib/handlebars/compiler/compiler.js +164 -23
  484. package/node_modules/handlebars/lib/handlebars/compiler/javascript-compiler.js +23 -7
  485. package/node_modules/handlebars/lib/handlebars/compiler/node-types.js +24 -0
  486. package/node_modules/handlebars/lib/handlebars/compiler/visitor.js +29 -5
  487. package/node_modules/handlebars/lib/handlebars/compiler/whitespace-control.js +16 -5
  488. package/node_modules/handlebars/lib/handlebars/exception.js +7 -3
  489. package/node_modules/handlebars/lib/handlebars/helpers/each.js +39 -16
  490. package/node_modules/handlebars/lib/handlebars/internal/proto-access.js +22 -0
  491. package/node_modules/handlebars/lib/handlebars/runtime.js +36 -4
  492. package/node_modules/handlebars/lib/handlebars/utils.js +3 -2
  493. package/node_modules/handlebars/lib/precompiler.js +14 -5
  494. package/node_modules/handlebars/package.json +2 -2
  495. package/node_modules/handlebars/release-notes.md +20 -1
  496. package/node_modules/handlebars/types/index.d.ts +8 -0
  497. package/node_modules/hdb/cfg/VERSION +1 -1
  498. package/node_modules/hdb/lib/Client.js +6 -2
  499. package/node_modules/hdb/lib/protocol/ClientInfo.js +28 -15
  500. package/node_modules/hdb/lib/protocol/Connection.js +30 -3
  501. package/node_modules/hdb/lib/protocol/Writer.js +2 -2
  502. package/node_modules/hdb/lib/protocol/common/ConnectOption.js +2 -0
  503. package/node_modules/hdb/lib/protocol/common/ConnectOptionFlagSet1.js +18 -0
  504. package/node_modules/hdb/lib/protocol/common/ConnectOptionType.js +2 -0
  505. package/node_modules/hdb/lib/protocol/common/Constants.js +1 -0
  506. package/node_modules/hdb/lib/protocol/common/MessageType.js +3 -2
  507. package/node_modules/hdb/lib/protocol/common/PartKind.js +2 -1
  508. package/node_modules/hdb/lib/protocol/common/index.js +1 -0
  509. package/node_modules/hdb/lib/protocol/data/TextList.js +25 -17
  510. package/node_modules/hdb/lib/protocol/data/index.js +1 -0
  511. package/node_modules/hdb/lib/protocol/part/ConnectOptions.js +7 -0
  512. package/node_modules/hdb/lib/protocol/request/index.js +7 -0
  513. package/node_modules/hdb/package.json +1 -2
  514. package/node_modules/livereload-js/.github/workflows/main.yml +4 -4
  515. package/node_modules/livereload-js/README.md +3 -3
  516. package/node_modules/livereload-js/dist/livereload.js +839 -2742
  517. package/node_modules/livereload-js/dist/livereload.min.js +1 -1
  518. package/node_modules/livereload-js/package.json +11 -11
  519. package/node_modules/minipass/LICENSE.md +55 -0
  520. package/node_modules/minipass/README.md +825 -0
  521. package/node_modules/minipass/dist/commonjs/index.d.ts +545 -0
  522. package/node_modules/minipass/dist/commonjs/index.d.ts.map +1 -0
  523. package/node_modules/minipass/dist/commonjs/index.js +1038 -0
  524. package/node_modules/minipass/dist/commonjs/index.js.map +1 -0
  525. package/node_modules/minipass/dist/commonjs/package.json +3 -0
  526. package/node_modules/minipass/dist/esm/index.d.ts +545 -0
  527. package/node_modules/minipass/dist/esm/index.d.ts.map +1 -0
  528. package/node_modules/minipass/dist/esm/index.js +1020 -0
  529. package/node_modules/minipass/dist/esm/index.js.map +1 -0
  530. package/node_modules/minipass/dist/esm/package.json +3 -0
  531. package/node_modules/minipass/package.json +77 -0
  532. package/node_modules/minizlib/LICENSE +26 -0
  533. package/node_modules/minizlib/README.md +64 -0
  534. package/node_modules/minizlib/dist/commonjs/constants.d.ts +2 -0
  535. package/node_modules/minizlib/dist/commonjs/constants.d.ts.map +1 -0
  536. package/node_modules/minizlib/dist/commonjs/constants.js +123 -0
  537. package/node_modules/minizlib/dist/commonjs/constants.js.map +1 -0
  538. package/node_modules/minizlib/dist/commonjs/index.d.ts +99 -0
  539. package/node_modules/minizlib/dist/commonjs/index.d.ts.map +1 -0
  540. package/node_modules/minizlib/dist/commonjs/index.js +416 -0
  541. package/node_modules/minizlib/dist/commonjs/index.js.map +1 -0
  542. package/node_modules/minizlib/dist/commonjs/package.json +3 -0
  543. package/node_modules/minizlib/dist/esm/constants.d.ts +2 -0
  544. package/node_modules/minizlib/dist/esm/constants.d.ts.map +1 -0
  545. package/node_modules/minizlib/dist/esm/constants.js +117 -0
  546. package/node_modules/minizlib/dist/esm/constants.js.map +1 -0
  547. package/node_modules/minizlib/dist/esm/index.d.ts +99 -0
  548. package/node_modules/minizlib/dist/esm/index.d.ts.map +1 -0
  549. package/node_modules/minizlib/dist/esm/index.js +363 -0
  550. package/node_modules/minizlib/dist/esm/index.js.map +1 -0
  551. package/node_modules/minizlib/dist/esm/package.json +3 -0
  552. package/node_modules/minizlib/package.json +80 -0
  553. package/node_modules/proxy-addr/HISTORY.md +60 -54
  554. package/node_modules/proxy-addr/README.md +1 -1
  555. package/node_modules/proxy-addr/index.js +32 -0
  556. package/node_modules/proxy-addr/package.json +8 -4
  557. package/node_modules/qs/.github/THREAT_MODEL.md +4 -2
  558. package/node_modules/qs/CHANGELOG.md +38 -14
  559. package/node_modules/qs/README.md +31 -3
  560. package/node_modules/qs/dist/qs.js +20 -20
  561. package/node_modules/qs/lib/parse.js +94 -4
  562. package/node_modules/qs/lib/stringify.js +4 -4
  563. package/node_modules/qs/lib/utils.js +130 -6
  564. package/node_modules/qs/package.json +4 -4
  565. package/node_modules/qs/test/parse.js +174 -0
  566. package/node_modules/qs/test/stringify.js +263 -33
  567. package/node_modules/qs/test/utils.js +184 -0
  568. package/node_modules/tar/LICENSE.md +55 -0
  569. package/node_modules/tar/README.md +1233 -0
  570. package/node_modules/tar/dist/commonjs/create.d.ts +3 -0
  571. package/node_modules/tar/dist/commonjs/create.d.ts.map +1 -0
  572. package/node_modules/tar/dist/commonjs/create.js +82 -0
  573. package/node_modules/tar/dist/commonjs/create.js.map +1 -0
  574. package/node_modules/tar/dist/commonjs/cwd-error.d.ts +8 -0
  575. package/node_modules/tar/dist/commonjs/cwd-error.d.ts.map +1 -0
  576. package/node_modules/tar/dist/commonjs/cwd-error.js +18 -0
  577. package/node_modules/tar/dist/commonjs/cwd-error.js.map +1 -0
  578. package/node_modules/tar/dist/commonjs/extract.d.ts +3 -0
  579. package/node_modules/tar/dist/commonjs/extract.d.ts.map +1 -0
  580. package/node_modules/tar/dist/commonjs/extract.js +88 -0
  581. package/node_modules/tar/dist/commonjs/extract.js.map +1 -0
  582. package/node_modules/tar/dist/commonjs/get-write-flag.d.ts +2 -0
  583. package/node_modules/tar/dist/commonjs/get-write-flag.d.ts.map +1 -0
  584. package/node_modules/tar/dist/commonjs/get-write-flag.js +32 -0
  585. package/node_modules/tar/dist/commonjs/get-write-flag.js.map +1 -0
  586. package/node_modules/tar/dist/commonjs/header.d.ts +53 -0
  587. package/node_modules/tar/dist/commonjs/header.d.ts.map +1 -0
  588. package/node_modules/tar/dist/commonjs/header.js +348 -0
  589. package/node_modules/tar/dist/commonjs/header.js.map +1 -0
  590. package/node_modules/tar/dist/commonjs/index.d.ts +20 -0
  591. package/node_modules/tar/dist/commonjs/index.d.ts.map +1 -0
  592. package/node_modules/tar/dist/commonjs/index.js +64 -0
  593. package/node_modules/tar/dist/commonjs/index.js.map +1 -0
  594. package/node_modules/tar/dist/commonjs/index.min.js +4 -0
  595. package/node_modules/tar/dist/commonjs/index.min.js.map +7 -0
  596. package/node_modules/tar/dist/commonjs/large-numbers.d.ts +3 -0
  597. package/node_modules/tar/dist/commonjs/large-numbers.d.ts.map +1 -0
  598. package/node_modules/tar/dist/commonjs/large-numbers.js +99 -0
  599. package/node_modules/tar/dist/commonjs/large-numbers.js.map +1 -0
  600. package/node_modules/tar/dist/commonjs/list.d.ts +7 -0
  601. package/node_modules/tar/dist/commonjs/list.d.ts.map +1 -0
  602. package/node_modules/tar/dist/commonjs/list.js +153 -0
  603. package/node_modules/tar/dist/commonjs/list.js.map +1 -0
  604. package/node_modules/tar/dist/commonjs/make-command.d.ts +49 -0
  605. package/node_modules/tar/dist/commonjs/make-command.d.ts.map +1 -0
  606. package/node_modules/tar/dist/commonjs/make-command.js +52 -0
  607. package/node_modules/tar/dist/commonjs/make-command.js.map +1 -0
  608. package/node_modules/tar/dist/commonjs/mkdir.d.ts +25 -0
  609. package/node_modules/tar/dist/commonjs/mkdir.d.ts.map +1 -0
  610. package/node_modules/tar/dist/commonjs/mkdir.js +187 -0
  611. package/node_modules/tar/dist/commonjs/mkdir.js.map +1 -0
  612. package/node_modules/tar/dist/commonjs/mode-fix.d.ts +2 -0
  613. package/node_modules/tar/dist/commonjs/mode-fix.d.ts.map +1 -0
  614. package/node_modules/tar/dist/commonjs/mode-fix.js +29 -0
  615. package/node_modules/tar/dist/commonjs/mode-fix.js.map +1 -0
  616. package/node_modules/tar/dist/commonjs/normalize-unicode.d.ts +2 -0
  617. package/node_modules/tar/dist/commonjs/normalize-unicode.d.ts.map +1 -0
  618. package/node_modules/tar/dist/commonjs/normalize-unicode.js +38 -0
  619. package/node_modules/tar/dist/commonjs/normalize-unicode.js.map +1 -0
  620. package/node_modules/tar/dist/commonjs/normalize-windows-path.d.ts +2 -0
  621. package/node_modules/tar/dist/commonjs/normalize-windows-path.d.ts.map +1 -0
  622. package/node_modules/tar/dist/commonjs/normalize-windows-path.js +12 -0
  623. package/node_modules/tar/dist/commonjs/normalize-windows-path.js.map +1 -0
  624. package/node_modules/tar/dist/commonjs/options.d.ts +604 -0
  625. package/node_modules/tar/dist/commonjs/options.d.ts.map +1 -0
  626. package/node_modules/tar/dist/commonjs/options.js +66 -0
  627. package/node_modules/tar/dist/commonjs/options.js.map +1 -0
  628. package/node_modules/tar/dist/commonjs/pack.d.ts +105 -0
  629. package/node_modules/tar/dist/commonjs/pack.d.ts.map +1 -0
  630. package/node_modules/tar/dist/commonjs/pack.js +544 -0
  631. package/node_modules/tar/dist/commonjs/pack.js.map +1 -0
  632. package/node_modules/tar/dist/commonjs/package.json +3 -0
  633. package/node_modules/tar/dist/commonjs/parse.d.ts +92 -0
  634. package/node_modules/tar/dist/commonjs/parse.d.ts.map +1 -0
  635. package/node_modules/tar/dist/commonjs/parse.js +655 -0
  636. package/node_modules/tar/dist/commonjs/parse.js.map +1 -0
  637. package/node_modules/tar/dist/commonjs/path-reservations.d.ts +11 -0
  638. package/node_modules/tar/dist/commonjs/path-reservations.d.ts.map +1 -0
  639. package/node_modules/tar/dist/commonjs/path-reservations.js +170 -0
  640. package/node_modules/tar/dist/commonjs/path-reservations.js.map +1 -0
  641. package/node_modules/tar/dist/commonjs/pax.d.ts +26 -0
  642. package/node_modules/tar/dist/commonjs/pax.d.ts.map +1 -0
  643. package/node_modules/tar/dist/commonjs/pax.js +182 -0
  644. package/node_modules/tar/dist/commonjs/pax.js.map +1 -0
  645. package/node_modules/tar/dist/commonjs/process-umask.d.ts +2 -0
  646. package/node_modules/tar/dist/commonjs/process-umask.d.ts.map +1 -0
  647. package/node_modules/tar/dist/commonjs/process-umask.js +7 -0
  648. package/node_modules/tar/dist/commonjs/process-umask.js.map +1 -0
  649. package/node_modules/tar/dist/commonjs/read-entry.d.ts +36 -0
  650. package/node_modules/tar/dist/commonjs/read-entry.d.ts.map +1 -0
  651. package/node_modules/tar/dist/commonjs/read-entry.js +136 -0
  652. package/node_modules/tar/dist/commonjs/read-entry.js.map +1 -0
  653. package/node_modules/tar/dist/commonjs/replace.d.ts +2 -0
  654. package/node_modules/tar/dist/commonjs/replace.d.ts.map +1 -0
  655. package/node_modules/tar/dist/commonjs/replace.js +227 -0
  656. package/node_modules/tar/dist/commonjs/replace.js.map +1 -0
  657. package/node_modules/tar/dist/commonjs/strip-absolute-path.d.ts +2 -0
  658. package/node_modules/tar/dist/commonjs/strip-absolute-path.d.ts.map +1 -0
  659. package/node_modules/tar/dist/commonjs/strip-absolute-path.js +29 -0
  660. package/node_modules/tar/dist/commonjs/strip-absolute-path.js.map +1 -0
  661. package/node_modules/tar/dist/commonjs/strip-trailing-slashes.d.ts +2 -0
  662. package/node_modules/tar/dist/commonjs/strip-trailing-slashes.d.ts.map +1 -0
  663. package/node_modules/tar/dist/commonjs/strip-trailing-slashes.js +18 -0
  664. package/node_modules/tar/dist/commonjs/strip-trailing-slashes.js.map +1 -0
  665. package/node_modules/tar/dist/commonjs/symlink-error.d.ts +9 -0
  666. package/node_modules/tar/dist/commonjs/symlink-error.d.ts.map +1 -0
  667. package/node_modules/tar/dist/commonjs/symlink-error.js +19 -0
  668. package/node_modules/tar/dist/commonjs/symlink-error.js.map +1 -0
  669. package/node_modules/tar/dist/commonjs/types.d.ts +16 -0
  670. package/node_modules/tar/dist/commonjs/types.d.ts.map +1 -0
  671. package/node_modules/tar/dist/commonjs/types.js +70 -0
  672. package/node_modules/tar/dist/commonjs/types.js.map +1 -0
  673. package/node_modules/tar/dist/commonjs/unpack.d.ts +101 -0
  674. package/node_modules/tar/dist/commonjs/unpack.d.ts.map +1 -0
  675. package/node_modules/tar/dist/commonjs/unpack.js +932 -0
  676. package/node_modules/tar/dist/commonjs/unpack.js.map +1 -0
  677. package/node_modules/tar/dist/commonjs/update.d.ts +2 -0
  678. package/node_modules/tar/dist/commonjs/update.d.ts.map +1 -0
  679. package/node_modules/tar/dist/commonjs/update.js +33 -0
  680. package/node_modules/tar/dist/commonjs/update.js.map +1 -0
  681. package/node_modules/tar/dist/commonjs/warn-method.d.ts +24 -0
  682. package/node_modules/tar/dist/commonjs/warn-method.d.ts.map +1 -0
  683. package/node_modules/tar/dist/commonjs/warn-method.js +31 -0
  684. package/node_modules/tar/dist/commonjs/warn-method.js.map +1 -0
  685. package/node_modules/tar/dist/commonjs/winchars.d.ts +3 -0
  686. package/node_modules/tar/dist/commonjs/winchars.d.ts.map +1 -0
  687. package/node_modules/tar/dist/commonjs/winchars.js +14 -0
  688. package/node_modules/tar/dist/commonjs/winchars.js.map +1 -0
  689. package/node_modules/tar/dist/commonjs/write-entry.d.ts +129 -0
  690. package/node_modules/tar/dist/commonjs/write-entry.d.ts.map +1 -0
  691. package/node_modules/tar/dist/commonjs/write-entry.js +698 -0
  692. package/node_modules/tar/dist/commonjs/write-entry.js.map +1 -0
  693. package/node_modules/tar/dist/esm/create.d.ts +3 -0
  694. package/node_modules/tar/dist/esm/create.d.ts.map +1 -0
  695. package/node_modules/tar/dist/esm/create.js +76 -0
  696. package/node_modules/tar/dist/esm/create.js.map +1 -0
  697. package/node_modules/tar/dist/esm/cwd-error.d.ts +8 -0
  698. package/node_modules/tar/dist/esm/cwd-error.d.ts.map +1 -0
  699. package/node_modules/tar/dist/esm/cwd-error.js +14 -0
  700. package/node_modules/tar/dist/esm/cwd-error.js.map +1 -0
  701. package/node_modules/tar/dist/esm/extract.d.ts +3 -0
  702. package/node_modules/tar/dist/esm/extract.d.ts.map +1 -0
  703. package/node_modules/tar/dist/esm/extract.js +49 -0
  704. package/node_modules/tar/dist/esm/extract.js.map +1 -0
  705. package/node_modules/tar/dist/esm/get-write-flag.d.ts +2 -0
  706. package/node_modules/tar/dist/esm/get-write-flag.d.ts.map +1 -0
  707. package/node_modules/tar/dist/esm/get-write-flag.js +26 -0
  708. package/node_modules/tar/dist/esm/get-write-flag.js.map +1 -0
  709. package/node_modules/tar/dist/esm/header.d.ts +53 -0
  710. package/node_modules/tar/dist/esm/header.d.ts.map +1 -0
  711. package/node_modules/tar/dist/esm/header.js +311 -0
  712. package/node_modules/tar/dist/esm/header.js.map +1 -0
  713. package/node_modules/tar/dist/esm/index.d.ts +20 -0
  714. package/node_modules/tar/dist/esm/index.d.ts.map +1 -0
  715. package/node_modules/tar/dist/esm/index.js +20 -0
  716. package/node_modules/tar/dist/esm/index.js.map +1 -0
  717. package/node_modules/tar/dist/esm/index.min.js +4 -0
  718. package/node_modules/tar/dist/esm/index.min.js.map +7 -0
  719. package/node_modules/tar/dist/esm/large-numbers.d.ts +3 -0
  720. package/node_modules/tar/dist/esm/large-numbers.d.ts.map +1 -0
  721. package/node_modules/tar/dist/esm/large-numbers.js +94 -0
  722. package/node_modules/tar/dist/esm/large-numbers.js.map +1 -0
  723. package/node_modules/tar/dist/esm/list.d.ts +7 -0
  724. package/node_modules/tar/dist/esm/list.d.ts.map +1 -0
  725. package/node_modules/tar/dist/esm/list.js +113 -0
  726. package/node_modules/tar/dist/esm/list.js.map +1 -0
  727. package/node_modules/tar/dist/esm/make-command.d.ts +49 -0
  728. package/node_modules/tar/dist/esm/make-command.d.ts.map +1 -0
  729. package/node_modules/tar/dist/esm/make-command.js +48 -0
  730. package/node_modules/tar/dist/esm/make-command.js.map +1 -0
  731. package/node_modules/tar/dist/esm/mkdir.d.ts +25 -0
  732. package/node_modules/tar/dist/esm/mkdir.d.ts.map +1 -0
  733. package/node_modules/tar/dist/esm/mkdir.js +179 -0
  734. package/node_modules/tar/dist/esm/mkdir.js.map +1 -0
  735. package/node_modules/tar/dist/esm/mode-fix.d.ts +2 -0
  736. package/node_modules/tar/dist/esm/mode-fix.d.ts.map +1 -0
  737. package/node_modules/tar/dist/esm/mode-fix.js +25 -0
  738. package/node_modules/tar/dist/esm/mode-fix.js.map +1 -0
  739. package/node_modules/tar/dist/esm/normalize-unicode.d.ts +2 -0
  740. package/node_modules/tar/dist/esm/normalize-unicode.d.ts.map +1 -0
  741. package/node_modules/tar/dist/esm/normalize-unicode.js +34 -0
  742. package/node_modules/tar/dist/esm/normalize-unicode.js.map +1 -0
  743. package/node_modules/tar/dist/esm/normalize-windows-path.d.ts +2 -0
  744. package/node_modules/tar/dist/esm/normalize-windows-path.d.ts.map +1 -0
  745. package/node_modules/tar/dist/esm/normalize-windows-path.js +9 -0
  746. package/node_modules/tar/dist/esm/normalize-windows-path.js.map +1 -0
  747. package/node_modules/tar/dist/esm/options.d.ts +604 -0
  748. package/node_modules/tar/dist/esm/options.d.ts.map +1 -0
  749. package/node_modules/tar/dist/esm/options.js +54 -0
  750. package/node_modules/tar/dist/esm/options.js.map +1 -0
  751. package/node_modules/tar/dist/esm/pack.d.ts +105 -0
  752. package/node_modules/tar/dist/esm/pack.d.ts.map +1 -0
  753. package/node_modules/tar/dist/esm/pack.js +502 -0
  754. package/node_modules/tar/dist/esm/pack.js.map +1 -0
  755. package/node_modules/tar/dist/esm/package.json +3 -0
  756. package/node_modules/tar/dist/esm/parse.d.ts +92 -0
  757. package/node_modules/tar/dist/esm/parse.d.ts.map +1 -0
  758. package/node_modules/tar/dist/esm/parse.js +651 -0
  759. package/node_modules/tar/dist/esm/parse.js.map +1 -0
  760. package/node_modules/tar/dist/esm/path-reservations.d.ts +11 -0
  761. package/node_modules/tar/dist/esm/path-reservations.d.ts.map +1 -0
  762. package/node_modules/tar/dist/esm/path-reservations.js +166 -0
  763. package/node_modules/tar/dist/esm/path-reservations.js.map +1 -0
  764. package/node_modules/tar/dist/esm/pax.d.ts +26 -0
  765. package/node_modules/tar/dist/esm/pax.d.ts.map +1 -0
  766. package/node_modules/tar/dist/esm/pax.js +178 -0
  767. package/node_modules/tar/dist/esm/pax.js.map +1 -0
  768. package/node_modules/tar/dist/esm/process-umask.d.ts +2 -0
  769. package/node_modules/tar/dist/esm/process-umask.d.ts.map +1 -0
  770. package/node_modules/tar/dist/esm/process-umask.js +3 -0
  771. package/node_modules/tar/dist/esm/process-umask.js.map +1 -0
  772. package/node_modules/tar/dist/esm/read-entry.d.ts +36 -0
  773. package/node_modules/tar/dist/esm/read-entry.d.ts.map +1 -0
  774. package/node_modules/tar/dist/esm/read-entry.js +132 -0
  775. package/node_modules/tar/dist/esm/read-entry.js.map +1 -0
  776. package/node_modules/tar/dist/esm/replace.d.ts +2 -0
  777. package/node_modules/tar/dist/esm/replace.d.ts.map +1 -0
  778. package/node_modules/tar/dist/esm/replace.js +221 -0
  779. package/node_modules/tar/dist/esm/replace.js.map +1 -0
  780. package/node_modules/tar/dist/esm/strip-absolute-path.d.ts +2 -0
  781. package/node_modules/tar/dist/esm/strip-absolute-path.d.ts.map +1 -0
  782. package/node_modules/tar/dist/esm/strip-absolute-path.js +25 -0
  783. package/node_modules/tar/dist/esm/strip-absolute-path.js.map +1 -0
  784. package/node_modules/tar/dist/esm/strip-trailing-slashes.d.ts +2 -0
  785. package/node_modules/tar/dist/esm/strip-trailing-slashes.d.ts.map +1 -0
  786. package/node_modules/tar/dist/esm/strip-trailing-slashes.js +14 -0
  787. package/node_modules/tar/dist/esm/strip-trailing-slashes.js.map +1 -0
  788. package/node_modules/tar/dist/esm/symlink-error.d.ts +9 -0
  789. package/node_modules/tar/dist/esm/symlink-error.d.ts.map +1 -0
  790. package/node_modules/tar/dist/esm/symlink-error.js +15 -0
  791. package/node_modules/tar/dist/esm/symlink-error.js.map +1 -0
  792. package/node_modules/tar/dist/esm/types.d.ts +16 -0
  793. package/node_modules/tar/dist/esm/types.d.ts.map +1 -0
  794. package/node_modules/tar/dist/esm/types.js +65 -0
  795. package/node_modules/tar/dist/esm/types.js.map +1 -0
  796. package/node_modules/tar/dist/esm/unpack.d.ts +101 -0
  797. package/node_modules/tar/dist/esm/unpack.d.ts.map +1 -0
  798. package/node_modules/tar/dist/esm/unpack.js +891 -0
  799. package/node_modules/tar/dist/esm/unpack.js.map +1 -0
  800. package/node_modules/tar/dist/esm/update.d.ts +2 -0
  801. package/node_modules/tar/dist/esm/update.d.ts.map +1 -0
  802. package/node_modules/tar/dist/esm/update.js +30 -0
  803. package/node_modules/tar/dist/esm/update.js.map +1 -0
  804. package/node_modules/tar/dist/esm/warn-method.d.ts +24 -0
  805. package/node_modules/tar/dist/esm/warn-method.d.ts.map +1 -0
  806. package/node_modules/tar/dist/esm/warn-method.js +27 -0
  807. package/node_modules/tar/dist/esm/warn-method.js.map +1 -0
  808. package/node_modules/tar/dist/esm/winchars.d.ts +3 -0
  809. package/node_modules/tar/dist/esm/winchars.d.ts.map +1 -0
  810. package/node_modules/tar/dist/esm/winchars.js +9 -0
  811. package/node_modules/tar/dist/esm/winchars.js.map +1 -0
  812. package/node_modules/tar/dist/esm/write-entry.d.ts +129 -0
  813. package/node_modules/tar/dist/esm/write-entry.d.ts.map +1 -0
  814. package/node_modules/tar/dist/esm/write-entry.js +656 -0
  815. package/node_modules/tar/dist/esm/write-entry.js.map +1 -0
  816. package/node_modules/tar/package.json +298 -0
  817. package/node_modules/ws/lib/websocket.js +17 -3
  818. package/node_modules/ws/package.json +1 -1
  819. package/node_modules/yallist/LICENSE.md +63 -0
  820. package/node_modules/yallist/README.md +205 -0
  821. package/node_modules/yallist/dist/commonjs/index.d.ts +39 -0
  822. package/node_modules/yallist/dist/commonjs/index.d.ts.map +1 -0
  823. package/node_modules/yallist/dist/commonjs/index.js +384 -0
  824. package/node_modules/yallist/dist/commonjs/index.js.map +1 -0
  825. package/node_modules/yallist/dist/commonjs/package.json +3 -0
  826. package/node_modules/yallist/dist/esm/index.d.ts +39 -0
  827. package/node_modules/yallist/dist/esm/index.d.ts.map +1 -0
  828. package/node_modules/yallist/dist/esm/index.js +379 -0
  829. package/node_modules/yallist/dist/esm/index.js.map +1 -0
  830. package/node_modules/yallist/dist/esm/package.json +3 -0
  831. package/node_modules/yallist/package.json +68 -0
  832. package/node_modules/yaml/browser/dist/compose/resolve-flow-scalar.js +19 -18
  833. package/node_modules/yaml/browser/dist/nodes/Alias.js +25 -23
  834. package/node_modules/yaml/dist/compose/resolve-flow-scalar.js +19 -18
  835. package/node_modules/yaml/dist/nodes/Alias.js +25 -23
  836. package/node_modules/yaml/package.json +1 -1
  837. package/package.json +7 -1
  838. package/bin/completion/templates/cds-tmpl.fish +0 -65
  839. package/bin/completion/templates/cds-tmpl.ps1 +0 -217
  840. package/bin/completion/templates/cds-tmpl.sh +0 -93
  841. package/bin/completion/templates/cds-tmpl.zsh +0 -74
  842. package/node_modules/@cap-js/db-service/lib/recursion-guard.js +0 -40
  843. package/node_modules/@sap/cds/lib/env/cds-requires.js +0 -326
  844. package/node_modules/@sap/cds-mtxs/srv/bootstrap.cds +0 -2
  845. package/node_modules/@sap/cds-mtxs/srv/bootstrap.js +0 -33
  846. package/node_modules/body-parser/node_modules/content-type/LICENSE +0 -22
  847. package/node_modules/body-parser/node_modules/content-type/README.md +0 -71
  848. package/node_modules/body-parser/node_modules/content-type/package.json +0 -52
  849. package/node_modules/content-disposition/index.js +0 -536
  850. package/node_modules/content-type/HISTORY.md +0 -29
  851. package/node_modules/content-type/index.js +0 -225
  852. package/node_modules/negotiator/node_modules/content-type/LICENSE +0 -22
  853. package/node_modules/negotiator/node_modules/content-type/README.md +0 -71
  854. package/node_modules/negotiator/node_modules/content-type/dist/index.d.ts +0 -46
  855. package/node_modules/negotiator/node_modules/content-type/dist/index.js +0 -176
  856. package/node_modules/negotiator/node_modules/content-type/dist/index.js.map +0 -1
  857. package/node_modules/negotiator/node_modules/content-type/package.json +0 -52
  858. package/node_modules/type-is/node_modules/content-type/LICENSE +0 -22
  859. package/node_modules/type-is/node_modules/content-type/README.md +0 -71
  860. package/node_modules/type-is/node_modules/content-type/dist/index.d.ts +0 -46
  861. package/node_modules/type-is/node_modules/content-type/dist/index.js +0 -176
  862. package/node_modules/type-is/node_modules/content-type/dist/index.js.map +0 -1
  863. package/node_modules/type-is/node_modules/content-type/package.json +0 -52
  864. /package/lib/init/template/react/files/{vite.config.js.hbs → vite.config.{{extension}}.hbs} +0 -0
  865. /package/lib/init/template/vue/files/src/{main.js → main.{{extension}}.hbs} +0 -0
  866. /package/lib/init/template/vue/files/{vite.config.js.hbs → vite.config.{{extension}}.hbs} +0 -0
  867. /package/{lib/import/openapi → node_modules/@cap-js/openapi/lib/import}/utilities.js +0 -0
  868. /package/node_modules/{body-parser/node_modules/content-type → content-type}/dist/index.d.ts +0 -0
  869. /package/node_modules/{body-parser/node_modules/content-type → content-type}/dist/index.js +0 -0
  870. /package/node_modules/{body-parser/node_modules/content-type → content-type}/dist/index.js.map +0 -0
@@ -0,0 +1,181 @@
1
+ const cds = require('../cds');
2
+ const crypto = require('node:crypto');
3
+ const http = require('node:http');
4
+
5
+ const DEBUG = cds.debug('cli');
6
+
7
+ // Fixed candidate ports for the loopback redirect: IAS matches redirect_uri exactly
8
+ // (incl. port), so `http://localhost:<port>/callback` must be pre-registered. First free wins.
9
+ const DEFAULT_PORTS = [8990, 8991, 8992, 8993, 8994];
10
+
11
+ // Base64-URL without padding (PKCE, RFC 7636).
12
+ function base64url(buffer) {
13
+ return buffer.toString('base64').replace(/\+/g, '-').replace(/\//g, '_').replace(/=+$/, '');
14
+ }
15
+
16
+ // PKCE code_verifier + S256 code_challenge.
17
+ function createPkce() {
18
+ const codeVerifier = base64url(crypto.randomBytes(32));
19
+ const codeChallenge = base64url(crypto.createHash('sha256').update(codeVerifier).digest());
20
+ return { codeVerifier, codeChallenge };
21
+ }
22
+
23
+ // Opens the URL in the default browser; returns whether a command was spawned.
24
+ function openBrowser(url) {
25
+ const platform = process.platform;
26
+ let command, args, spawnOpts = { stdio: 'ignore', detached: true };
27
+ if (platform === 'darwin') {
28
+ command = 'open';
29
+ args = [url];
30
+ } else if (platform === 'win32') {
31
+ // Caret-escape cmd metacharacters (esp. `&`) so `start` doesn't truncate the URL.
32
+ const escaped = url.replace(/[&^|<>()%"]/g, m => '^' + m);
33
+ command = `start "" ${escaped}`;
34
+ args = [];
35
+ spawnOpts = { ...spawnOpts, shell: true, windowsVerbatimArguments: true };
36
+ } else {
37
+ command = 'xdg-open';
38
+ args = [url];
39
+ }
40
+ try {
41
+ const child = require('node:child_process').spawn(command, args, spawnOpts);
42
+ child.on('error', err => DEBUG?.(`Failed to open browser via ${command}: ${err.message}`));
43
+ child.unref();
44
+ return true;
45
+ } catch (err) {
46
+ DEBUG?.(`Failed to open browser via ${command}: ${err.message}`);
47
+ return false;
48
+ }
49
+ }
50
+
51
+ function escapeHtml(s) {
52
+ return String(s)
53
+ .replaceAll('&', '&amp;')
54
+ .replaceAll('<', '&lt;')
55
+ .replaceAll('>', '&gt;')
56
+ .replaceAll('"', '&quot;');
57
+ }
58
+
59
+ function htmlResponse(title, message) {
60
+ return `<!DOCTYPE html><html><head><meta charset="utf-8"><title>${escapeHtml(title)}</title></head>` +
61
+ `<body style="font-family:sans-serif;text-align:center;padding-top:3em">` +
62
+ `<h1>${escapeHtml(title)}</h1><p>${escapeHtml(message)}</p></body></html>`;
63
+ }
64
+
65
+ /**
66
+ * OAuth 2.0 Authorization Code + PKCE via a loopback redirect (RFC 8252): starts a
67
+ * local server on a fixed port (IAS requires an exact, pre-registered redirect_uri),
68
+ * opens the browser, and resolves with the authorization code.
69
+ *
70
+ * @param {object} metadata Authorization metadata from the server.
71
+ * @param {string} metadata.authorization_endpoint
72
+ * @param {string} metadata.client_id
73
+ * @param {string} [metadata.scope]
74
+ * @param {object} [options]
75
+ * @param {boolean} [options.noBrowser] Only print the URL instead of opening a browser.
76
+ * @param {number} [options.timeout] Milliseconds to wait for the redirect (default 300000).
77
+ * @param {number[]} [options.ports] Candidate fixed ports for the loopback server.
78
+ * @param {string} [options.host] Loopback host to bind/redirect to (default 'localhost').
79
+ * @returns {Promise<{code: string, codeVerifier: string, redirectUri: string}>}
80
+ */
81
+ async function authorizeViaBrowser(metadata, { noBrowser = false, timeout = 5 * 60 * 1000, ports = DEFAULT_PORTS, host = 'localhost' } = {}) {
82
+ const { authorization_endpoint, client_id, scope, app_tid } = metadata;
83
+ if (!authorization_endpoint || !client_id) {
84
+ throw 'Incomplete authorization metadata received from server (missing authorization_endpoint or client_id).';
85
+ }
86
+
87
+ const { codeVerifier, codeChallenge } = createPkce();
88
+ const state = base64url(crypto.randomBytes(16));
89
+
90
+ return new Promise((resolve, reject) => {
91
+ let settled = false;
92
+ let timer;
93
+ const finish = (fn, arg) => {
94
+ if (settled) return;
95
+ settled = true;
96
+ clearTimeout(timer);
97
+ server.close();
98
+ fn(arg);
99
+ };
100
+
101
+ const server = http.createServer((req, res) => {
102
+ const requestUrl = new URL(req.url, redirectBase);
103
+ if (requestUrl.pathname !== '/callback') {
104
+ res.statusCode = 404;
105
+ return res.end();
106
+ }
107
+ const params = requestUrl.searchParams;
108
+ const error = params.get('error');
109
+ const returnedState = params.get('state');
110
+ const code = params.get('code');
111
+
112
+ if (error) {
113
+ res.setHeader('Content-Type', 'text/html');
114
+ res.end(htmlResponse('Login failed', `The identity provider returned an error: ${error}.`));
115
+ return finish(reject, `Authorization failed: ${error}${params.get('error_description') ? ` (${params.get('error_description')})` : ''}.`);
116
+ }
117
+ if (returnedState !== state) {
118
+ res.statusCode = 400;
119
+ res.setHeader('Content-Type', 'text/html');
120
+ res.end(htmlResponse('Login failed', 'State mismatch. Please try again.'));
121
+ return finish(reject, 'Authorization failed: state mismatch (possible CSRF). Please retry the login.');
122
+ }
123
+ if (!code) {
124
+ res.statusCode = 400;
125
+ res.setHeader('Content-Type', 'text/html');
126
+ res.end(htmlResponse('Login failed', 'No authorization code received.'));
127
+ return finish(reject, 'Authorization failed: no authorization code received.');
128
+ }
129
+
130
+ res.setHeader('Content-Type', 'text/html');
131
+ res.end(htmlResponse('Login successful', 'You may now close this tab and return to the terminal.'));
132
+ finish(resolve, { code, codeVerifier, redirectUri });
133
+ });
134
+
135
+ server.on('error', err => {
136
+ if (err.code === 'EADDRINUSE' && candidates.length) return listenNext(); // try next port
137
+ finish(reject, `Failed to start local login server: ${err.message}`);
138
+ });
139
+
140
+ let redirectBase, redirectUri;
141
+ const candidates = [...ports];
142
+ const listenNext = () => {
143
+ const port = candidates.shift();
144
+ server.listen(port, '127.0.0.1');
145
+ };
146
+ server.on('listening', () => {
147
+ const { port } = server.address();
148
+ redirectBase = `http://${host}:${port}`;
149
+ redirectUri = `${redirectBase}/callback`;
150
+
151
+ const authUrl = new URL(authorization_endpoint);
152
+ authUrl.searchParams.set('response_type', 'code');
153
+ authUrl.searchParams.set('client_id', client_id);
154
+ authUrl.searchParams.set('redirect_uri', redirectUri);
155
+ authUrl.searchParams.set('code_challenge', codeChallenge);
156
+ authUrl.searchParams.set('code_challenge_method', 'S256');
157
+ authUrl.searchParams.set('state', state);
158
+ if (scope) authUrl.searchParams.set('scope', scope);
159
+ if (app_tid) authUrl.searchParams.set('app_tid', app_tid); // multi-tenant IAS client disambiguation
160
+
161
+ timer = setTimeout(
162
+ () => finish(reject, 'Timed out waiting for browser login. Please try again.'),
163
+ timeout
164
+ );
165
+ timer.unref?.();
166
+
167
+ const url = authUrl.toString();
168
+ if (noBrowser || !openBrowser(url)) {
169
+ console.log('Please open the following URL in your browser to log in:');
170
+ console.log(`\n ${url}\n`);
171
+ } else {
172
+ console.log('Opening browser for single sign-on. Complete the login there to continue…');
173
+ DEBUG?.(`Authorization URL: ${url}`);
174
+ }
175
+ DEBUG?.(`Waiting for the authorization code on ${redirectUri}`);
176
+ });
177
+ listenNext();
178
+ });
179
+ }
180
+
181
+ module.exports = { authorizeViaBrowser, createPkce, openBrowser, DEFAULT_PORTS };
package/lib/mtx/params.js CHANGED
@@ -175,6 +175,12 @@ class BasicParams {
175
175
  // AUTH PARAMS
176
176
  // - non-persisted
177
177
  this.passcode = new Param('passcode', undefined, { obfuscate: ObfuscationLevel.partial });
178
+ this.authorizationCode = new Param('authorizationCode', undefined, { obfuscate: ObfuscationLevel.partial }); // IAS SSO: auth code
179
+ this.codeVerifier = new Param('codeVerifier', undefined, { obfuscate: ObfuscationLevel.full }); // IAS SSO: PKCE verifier
180
+ this.redirectUri = new Param('redirectUri', undefined, { internal: true }); // IAS SSO: loopback redirect
181
+ this.noBrowser = new Param('noBrowser', false, { internal: true }); // IAS SSO: don't auto-open browser
182
+ this.port = new Param('port', undefined); // IAS SSO: fixed loopback port
183
+ this.appTid = new Param('appTid', undefined, { internal: true }); // IAS SSO: app_tid
178
184
  this.password = new Param('password', undefined, { obfuscate: ObfuscationLevel.full });
179
185
  this.clientid = new Param('clientid', undefined);
180
186
  this.clientsecret = new Param('clientsecret', undefined, { obfuscate: ObfuscationLevel.partial });
@@ -137,9 +137,10 @@ async function deriveUaaTokenUrl(params) {
137
137
  async function fetchAuthMetadata(params) {
138
138
  let fetchUrl = appUrlWith(OAUTH_META_PATH, params);
139
139
  DEBUG?.(`Trying to get authorization metadata from GET`, fetchUrl);
140
- if (params.has('subdomain')) {
140
+ if (params.has('subdomain') || params.has('appTid')) {
141
141
  const u = new URL(fetchUrl);
142
- u.searchParams.set('subdomain', params.get('subdomain'));
142
+ if (params.has('subdomain')) u.searchParams.set('subdomain', params.get('subdomain'));
143
+ if (params.has('appTid')) u.searchParams.set('app_tid', params.get('appTid'));
143
144
  fetchUrl = u.toString();
144
145
  }
145
146
  let responseData;
@@ -396,6 +397,27 @@ class SettingsManager {
396
397
  throw 'Passcode cannot be empty';
397
398
  }
398
399
  }
400
+ // IAS browser SSO (Authorization Code + PKCE, loopback). Returns true if used,
401
+ // false to fall back to passcode entry (XSUAA).
402
+ async function addBrowserSso() {
403
+ const metadata = await fetchAuthMetadata(params);
404
+ if (metadata?.flow !== 'authorization_code') {
405
+ return false;
406
+ }
407
+ const { authorizeViaBrowser } = require('./browser_login');
408
+ const port = params.get('port');
409
+ // An explicit --app-tid wins over the server-resolved value on the authorize URL.
410
+ if (params.has('appTid')) metadata.app_tid = params.get('appTid');
411
+ const { code, codeVerifier, redirectUri } = await authorizeViaBrowser(metadata, {
412
+ noBrowser: params.get('noBrowser'),
413
+ ...(port && { ports: [Number(port)] })
414
+ });
415
+ params.set('authorizationCode', code);
416
+ params.set('codeVerifier', codeVerifier);
417
+ params.set('redirectUri', redirectUri);
418
+ if (metadata.app_tid) params.set('appTid', metadata.app_tid); // for the token exchange
419
+ return true;
420
+ }
399
421
  async function addAuthSettings() {
400
422
  function removeObsoleteToken() {
401
423
  if (params.get('renewLogin') || params.get('tokenExpirationDate') <= Date.now()) {
@@ -467,8 +489,11 @@ class SettingsManager {
467
489
  }
468
490
 
469
491
  await addAuthSettings();
470
- if (!logout && !params.has('token') && !params.has('refreshToken') && !params.has('passcode') && !params.has('clientsecret') && !params.has('key')) {
471
- await addPasscode();
492
+ if (!logout && !params.has('token') && !params.has('refreshToken') && !params.has('passcode') && !params.has('authorizationCode') && !params.has('clientsecret') && !params.has('key')) {
493
+ // Prefer browser-based SSO (IAS); fall back to passcode entry (XSUAA).
494
+ if (!await addBrowserSso()) {
495
+ await addPasscode();
496
+ }
472
497
  }
473
498
  }
474
499
 
package/lib/util/cf.js CHANGED
@@ -1,4 +1,5 @@
1
1
  const cp = require('child_process');
2
+ const { X509Certificate } = require('crypto');
2
3
  const fsp = require('fs').promises;
3
4
  const os = require('os');
4
5
  const path = require('path');
@@ -13,6 +14,7 @@ const LOG = cds.log ? cds.log('cli') : console;
13
14
  const DEBUG = cds.debug('cli');
14
15
 
15
16
  const { bold, warn } = require('./term');
17
+ const { ask4 } = require('./question');
16
18
 
17
19
  const { URLS } = require('../init/constants');
18
20
 
@@ -64,7 +66,7 @@ module.exports = new class CfUtil {
64
66
  }
65
67
  }
66
68
 
67
- async curl(urlPath, queryObj, bodyObj) {
69
+ async curl(urlPath, queryObj, bodyObj, method = bodyObj ? 'POST' : 'GET') {
68
70
  let url = this.#target.apiEndpoint + urlPath
69
71
 
70
72
  const headers = { 'Authorization': this.#target.token }
@@ -77,9 +79,8 @@ module.exports = new class CfUtil {
77
79
  url += '?' + parts.join('&')
78
80
  }
79
81
 
80
- const fetchOptions = { headers }
82
+ const fetchOptions = { headers, method }
81
83
  if (bodyObj) {
82
- fetchOptions.method = 'POST'
83
84
  fetchOptions.headers['Content-Type'] = 'application/json'
84
85
  fetchOptions.body = JSON.stringify(bodyObj)
85
86
  }
@@ -100,7 +101,6 @@ module.exports = new class CfUtil {
100
101
  const data = text ? JSON.parse(text) : {}
101
102
 
102
103
  if (LOG._debug) {
103
- const method = fetchOptions.method || 'GET'
104
104
  LOG.debug(`${method} ${url}\n${JSON.stringify({ headers: { ...headers, Authorization: 'bearer <token>' } }, null, 4)}\n${JSON.stringify(data, null, 4)}`)
105
105
  }
106
106
 
@@ -359,17 +359,24 @@ module.exports = new class CfUtil {
359
359
  }
360
360
  }
361
361
 
362
- throw `Timeout occurred while getting service key ${bold(serviceKeyName)}`;
362
+ throw `timeout occurred while getting service key ${bold(serviceKeyName)}`;
363
363
  }
364
364
 
365
- async getOrCreateServiceKey(serviceInstance, serviceKeyName, parameters, { silent = false } = {}) {
365
+ async getOrCreateServiceKey(serviceInstance, serviceKeyName, parameters, { silent = false, create = true } = {}) {
366
366
  const serviceKey = await this._getServiceKey(serviceInstance, serviceKeyName);
367
- if (serviceKey) {
367
+ const expired = serviceKey?.certificate && serviceKey?.key && Date.parse(new X509Certificate(serviceKey.certificate).validTo) <= Date.now()
368
+ if (serviceKey && !expired) {
368
369
  DEBUG?.(`getting service key ${bold(serviceKeyName)}`)
369
370
  return serviceKey;
370
371
  }
372
+ if (expired) {
373
+ if (!create || !process.stdin.isTTY) throw `service key ${bold(serviceKeyName)} has expired`
374
+ await this.deleteServiceKey(serviceInstance, serviceKeyName, { silent })
375
+ } else if (!create) {
376
+ return
377
+ }
371
378
 
372
- if (!silent) console.log(`creating service key ${bold(serviceKeyName)} - please be patient...`);
379
+ if (!silent && !expired) console.log(`creating service key ${bold(serviceKeyName)} - please be patient...`);
373
380
 
374
381
  const body = {
375
382
  type: 'key',
@@ -397,6 +404,35 @@ module.exports = new class CfUtil {
397
404
  throw `could not create service key ${bold(serviceKeyName)}`;
398
405
  }
399
406
 
407
+ async deleteServiceKey(serviceInstance, serviceKeyName, { silent = false } = {}) {
408
+ const query = { names: serviceKeyName, service_instance_guids: serviceInstance.guid }
409
+ const bindings = await this.curl('/v3/service_credential_bindings', query)
410
+ const binding = bindings?.resources?.find(binding => binding.name === serviceKeyName)
411
+ if (!binding) return
412
+ const bindingGuid = binding.guid
413
+
414
+ if (!await this.confirmServiceKeyDeletion(serviceKeyName)) {
415
+ throw `service key ${bold(serviceKeyName)} was not renewed because deletion was not confirmed`
416
+ }
417
+ if (!silent) console.log(`renewing expired service key ${bold(serviceKeyName)} - please be patient...`);
418
+ await this.curl(`/v3/service_credential_bindings/${encodeURIComponent(bindingGuid)}`, undefined, undefined, 'DELETE')
419
+
420
+ let counter = POLL_COUNTER
421
+ while (counter > 0) {
422
+ counter--
423
+ const remaining = await this.curl('/v3/service_credential_bindings', query)
424
+ if (!remaining?.resources?.some(binding => binding.guid === bindingGuid)) return
425
+ await this._sleep(POLL_DELAY)
426
+ }
427
+
428
+ throw `timeout occurred while deleting service key ${bold(serviceKeyName)}`
429
+ }
430
+
431
+ async confirmServiceKeyDeletion(serviceKeyName) {
432
+ const answer = await ask4([`service key ${bold(serviceKeyName)} has expired and must be deleted before it can be recreated, continue? (y/N) `])
433
+ return /^(y|yes)$/i.test(answer.trim())
434
+ }
435
+
400
436
  // CF V3 API treats commas in the 'names' filter as delimiters.
401
437
  // When a name contains a comma, omit it from the query and rely on client-side filtering.
402
438
  #safeNameQuery(query) {
package/lib/util/fs.js CHANGED
@@ -61,8 +61,8 @@ async function copyRenderedJSON(src, dst, project) {
61
61
  /* General */
62
62
 
63
63
  function isRoot(folder) {
64
- const { root, dir } = parse(folder)
65
- return root === dir
64
+ const { root, dir, base } = parse(folder)
65
+ return root === dir && base === ''
66
66
  }
67
67
 
68
68
  const DEFAULT_CONCURRENCY = (() => {
@@ -4,6 +4,29 @@
4
4
  - The format is based on [Keep a Changelog](http://keepachangelog.com/).
5
5
  - This project adheres to [Semantic Versioning](http://semver.org/).
6
6
 
7
+ ## [3.1.2](https://github.com/cap-js/cds-dbs/compare/db-service-v3.1.1...db-service-v3.1.2) (2026-10-09)
8
+
9
+
10
+ ### Fixed
11
+
12
+ * allow path expressions in infix filter of expands ([#1755](https://github.com/cap-js/cds-dbs/issues/1755)) ([cbe4f65](https://github.com/cap-js/cds-dbs/commit/cbe4f659add279fdb4155aad6bc155552dd276db))
13
+ * **cqn2pql:** handle parameterized views in from_args ([#1738](https://github.com/cap-js/cds-dbs/issues/1738)) ([8f4dc35](https://github.com/cap-js/cds-dbs/commit/8f4dc354022b861569eab014cb469d4259c91278))
14
+ * Primary keys were not resolved for localized. entities ([#1749](https://github.com/cap-js/cds-dbs/issues/1749)) ([410eef8](https://github.com/cap-js/cds-dbs/commit/410eef8f4487bd8e0c8b5a34a3637959095e255b))
15
+ * recurse into xpr nodes in collectDistanceTo ([#1746](https://github.com/cap-js/cds-dbs/issues/1746)) ([c5dc20d](https://github.com/cap-js/cds-dbs/commit/c5dc20d8c1cd467aec4df3a33f0b6abe43027fe8))
16
+
17
+ ## [3.1.1](https://github.com/cap-js/cds-dbs/compare/db-service-v3.1.0...db-service-v3.1.1) (2026-09-15)
18
+
19
+
20
+ ### Fixed
21
+
22
+ * **cqn4sql:** correctly expand `not exists <assoc>` alongside a null-check branch ([#1736](https://github.com/cap-js/cds-dbs/issues/1736)) ([bfb0a01](https://github.com/cap-js/cds-dbs/commit/bfb0a010cce2cea089f4fabf92a3ecea43486a09))
23
+
24
+
25
+ ### Performance Improvements
26
+
27
+ * do not use ranked search for static values ([#1727](https://github.com/cap-js/cds-dbs/issues/1727)) ([33fb36b](https://github.com/cap-js/cds-dbs/commit/33fb36bbf0f86291e5fc0b9e2ff5b7244b49d19e))
28
+ * if explicit order by is specified, do not add ranked search as a secondary clause ([33fb36b](https://github.com/cap-js/cds-dbs/commit/33fb36bbf0f86291e5fc0b9e2ff5b7244b49d19e))
29
+
7
30
  ## [3.1.0](https://github.com/cap-js/cds-dbs/compare/db-service-v3.0.1...db-service-v3.1.0) (2026-09-07)
8
31
 
9
32
 
@@ -22,6 +22,10 @@ class CQN2PQLRenderer extends CQN2SQL {
22
22
  return super.column_expr(x, q)
23
23
  }
24
24
 
25
+ from_args(args) {
26
+ return `(${Object.keys(args).map(k => `${k}: ${this.expr(args[k])}`).join(', ')})`
27
+ }
28
+
25
29
  SELECT_expand(q, sql) { return sql }
26
30
 
27
31
  INSERT_entries(q) {
@@ -579,6 +579,9 @@ class CQN2SQLRenderer {
579
579
  distanceVal = where[i]
580
580
  where[i] = { val: where[i].val + 1 }
581
581
  }
582
+ else if (c.xpr) {
583
+ collectDistanceTo(c.xpr, innot)
584
+ }
582
585
  }
583
586
  }
584
587
 
@@ -33,9 +33,6 @@ const notSupportedOps = [['>'], ['<'], ['>='], ['<='], ['*'], ['+'], ['-'], ['/'
33
33
 
34
34
  const allOps = eqOps.concat(eqOps).concat(notEqOps).concat(notSupportedOps)
35
35
 
36
-
37
- const { depthGuarded, guardEntry } = require('./recursion-guard')
38
-
39
36
  const { pseudos } = require('./infer/pseudos')
40
37
  /**
41
38
  * Transforms a CDL style query into SQL-Like CQN:
@@ -58,17 +55,7 @@ const { pseudos } = require('./infer/pseudos')
58
55
  * @returns {object} transformedQuery the transformed query
59
56
  */
60
57
  function cqn4sql(originalQuery, model, useTechnicalAlias = true) {
61
- // guardEntry bounds subquery nesting and resets the depth budget per top-level call
62
- return guardEntry(_cqn4sql)(originalQuery, model, useTechnicalAlias)
63
- }
64
-
65
- function _cqn4sql(originalQuery, model, useTechnicalAlias = true) {
66
58
  const getImplicitAlias = str => _getImplicitAlias(str, useTechnicalAlias)
67
- // guard xpr and inline/expand-on-struct nesting
68
- // eslint-disable-next-line no-func-assign
69
- getTransformedTokenStream = depthGuarded(getTransformedTokenStream)
70
- // eslint-disable-next-line no-func-assign
71
- nestedProjectionOnStructure = depthGuarded(nestedProjectionOnStructure)
72
59
  let inferred = typeof originalQuery === 'string' ? cds.parse.cql(originalQuery) : cds.ql.clone(originalQuery)
73
60
  const hasCustomJoins =
74
61
  originalQuery.SELECT?.from.args && (!originalQuery.joinTree || originalQuery.joinTree.isInitial)
@@ -198,7 +185,7 @@ function _cqn4sql(originalQuery, model, useTechnicalAlias = true) {
198
185
  /**
199
186
  * If the target entity is annotated with persistence skip and has an underlying db entity,
200
187
  * we treat it as a runtime view and transform it into a CTE.
201
- *
188
+ *
202
189
  * @param {object} transformedQuery - The query object to be transformed.
203
190
  * @param {string} model - The data model used for inference and transformation.
204
191
  */
@@ -214,10 +201,10 @@ function _cqn4sql(originalQuery, model, useTechnicalAlias = true) {
214
201
  }
215
202
 
216
203
  /**
217
- * Recursively call cqn4sql for all nested runtime views to calculate cte and
204
+ * Recursively call cqn4sql for all nested runtime views to calculate cte and
218
205
  * add it as a with clause to the transformed query.
219
206
  * Alias the runtime view with a unique alias and update all references to the runtime view to point to the alias.
220
- *
207
+ *
221
208
  * @param {object} rootDefinition - The root definition of the query. This is used to recursively process nested runtime views.
222
209
  * @param {object} transformedQuery - The query object to be transformed.
223
210
  * @param {string} model - The data model used for infer and cqn4sql.
@@ -338,9 +325,11 @@ function _cqn4sql(originalQuery, model, useTechnicalAlias = true) {
338
325
  // it would sort by a constant boolean.
339
326
  const ranksSearch =
340
327
  cds.db?.kind === 'hana' && cds.env.hana?.fuzzy !== false && cds.env.hana?.fuzzy?.ranked_search !== false
341
- // count queries do not need ranked search
342
- const isCountQuery = columns?.length === 1 && columns[0].func === 'count'
343
- const searchRank = ranksSearch && !isCountQuery && inferred.$searchRank && buildSearchRankOrderBy(inferred.$searchRank)
328
+ // count queries or static values do not need ranked search
329
+ const isCountQuery = columns?.length === 1 && typeof columns[0] === 'object' && (columns[0].func === 'count' || 'val' in columns[0])
330
+ // a user-provided ORDER BY takes precedence over the search rank — don't inject the ranking then
331
+ const hasExplicitOrderBy = (orderBy || []).some(o => !o.implicit)
332
+ const searchRank = ranksSearch && !isCountQuery && !hasExplicitOrderBy && inferred.$searchRank && buildSearchRankOrderBy(inferred.$searchRank)
344
333
  if (searchRank) {
345
334
  // precedence: user ordering, then rank, then the runtime's implicit key ordering
346
335
  const implicitAt = (orderBy || []).findIndex(o => o.implicit)
@@ -419,8 +408,6 @@ function _cqn4sql(originalQuery, model, useTechnicalAlias = true) {
419
408
  */
420
409
  function translateAssocsToJoins() {
421
410
  let from
422
- // guard association-path length
423
- const joinForBranch = depthGuarded(_joinForBranch)
424
411
  /**
425
412
  * remember already seen aliases, do not create a join for them again
426
413
  */
@@ -444,7 +431,7 @@ function _cqn4sql(originalQuery, model, useTechnicalAlias = true) {
444
431
  })
445
432
  return from.args.length > 1 ? from : from.args[0]
446
433
 
447
- function _joinForBranch(lhs, node) {
434
+ function joinForBranch(lhs, node) {
448
435
  const nextAssoc = inferred.joinTree.findNextAssoc(node)
449
436
  if (!nextAssoc || alreadySeen.has(nextAssoc.$refLink.alias)) return lhs.args.length > 1 ? lhs : lhs.args[0]
450
437
 
@@ -1033,11 +1020,11 @@ function _cqn4sql(originalQuery, model, useTechnicalAlias = true) {
1033
1020
  const keyName = k.as || k.ref.join('_')
1034
1021
  const fkName = `${elemName}_${keyName}` // e.g., 'head_id'
1035
1022
  const fkFullName = `${columnAlias}_${fkName}` // e.g., 'department_head_id'
1036
-
1023
+
1037
1024
  // Check if this FK is excluded
1038
1025
  if (exclude.some(e => (e.ref?.at(-1) || e.as || e) === fkName)) continue
1039
1026
  if (exclude.some(e => (e.ref?.at(-1) || e.as || e) === fkFullName)) continue
1040
-
1027
+
1041
1028
  const flatColumn = {
1042
1029
  ref: [joinAlias, fkName],
1043
1030
  as: fkFullName,
@@ -1055,7 +1042,7 @@ function _cqn4sql(originalQuery, model, useTechnicalAlias = true) {
1055
1042
  calcElement.as = fullName
1056
1043
  }
1057
1044
  res.push(calcElement)
1058
- }
1045
+ }
1059
1046
  else {
1060
1047
  // Scalar element
1061
1048
  const flatColumn = {
@@ -1776,8 +1763,10 @@ function _cqn4sql(originalQuery, model, useTechnicalAlias = true) {
1776
1763
  }
1777
1764
 
1778
1765
  const whereExists = { SELECT: whereExistsSubqueries(whereExistsSubSelects) }
1779
- transformedTokenStream[i + 1] = whereExists
1780
- // skip newly created subquery from being iterated
1766
+ // append, don't index by `i`: a preceding branch (e.g. flattening `<assoc> is null`)
1767
+ // may have changed the transformed stream's length, so `[i + 1]` would leave holes
1768
+ transformedTokenStream.push(whereExists)
1769
+ // skip the association ref which we just turned into the subquery
1781
1770
  i += 1
1782
1771
  } else if (token !== null && typeof token === 'object' && '#' in token) {
1783
1772
  // Enum token: resolve to its value
@@ -2966,7 +2955,7 @@ function setElementOnColumns(col, element) {
2966
2955
 
2967
2956
  function getPrimaryKey(entity, tableAlias = null) {
2968
2957
  const primaryKey = []
2969
- for (const k of Object.keys(entity.elements)) {
2958
+ for (const k in entity.elements) {
2970
2959
  const e = entity.elements[k]
2971
2960
  if (e.key === true && !e.virtual && e.isAssociation !== true) {
2972
2961
  primaryKey.push({ ref: tableAlias ? [tableAlias, e.name] : [e.name] })
@@ -5,19 +5,15 @@ const cds = require('@sap/cds')
5
5
  const JoinTree = require('./join-tree')
6
6
  const { pseudos } = require('./pseudos')
7
7
  const { isCalculatedOnRead, getImplicitAlias, getModelUtils, defineProperty, hasOwnSkip, isRuntimeView } = require('../utils')
8
- const { depthGuarded, guardEntry } = require('../recursion-guard')
9
8
  const cdsTypes = cds.builtin.types
10
9
  /**
11
10
  * @param {import('@sap/cds/apis/cqn').Query|string} originalQuery
12
11
  * @param {import('@sap/cds/apis/csn').CSN} [model]
13
12
  * @returns {import('./cqn').Query} = q with .target and .elements
14
13
  */
15
- function _infer(originalQuery, model, useTechnicalAlias = true) {
14
+ function infer(originalQuery, model, useTechnicalAlias = true) {
16
15
  if (!model) throw new Error('Please specify a model')
17
16
  const inferred = originalQuery
18
- // guard func args / lists / xpr / exists nesting
19
- // eslint-disable-next-line no-func-assign
20
- inferArg = depthGuarded(inferArg)
21
17
 
22
18
  const { getDefinition } = getModelUtils(model, originalQuery)
23
19
 
@@ -295,23 +291,19 @@ function _infer(originalQuery, model, useTechnicalAlias = true) {
295
291
  */
296
292
  function walkTokenStream(tokenStream, inXpr = false) {
297
293
  let skipJoins
298
- const processToken = depthGuarded(walker())
299
- tokenStream.forEach(processToken)
300
-
301
- function walker() {
302
- return t => {
303
- if (t === 'exists') {
304
- // no joins for infix filters along `exists <path>`
305
- skipJoins = true
306
- } else if (t.xpr) {
307
- // don't miss an exists within an expression
308
- t.xpr.forEach(processToken)
309
- } else {
310
- inferArg(t, queryElements, null, { inExists: skipJoins, inXpr, inQueryModifier: true })
311
- skipJoins = false
312
- }
294
+ const processToken = t => {
295
+ if (t === 'exists') {
296
+ // no joins for infix filters along `exists <path>`
297
+ skipJoins = true
298
+ } else if (t.xpr) {
299
+ // don't miss an exists within an expression
300
+ t.xpr.forEach(processToken)
301
+ } else {
302
+ inferArg(t, queryElements, null, { inExists: skipJoins, inXpr, inQueryModifier: true })
303
+ skipJoins = false
313
304
  }
314
305
  }
306
+ tokenStream.forEach(processToken)
315
307
  }
316
308
  /**
317
309
  * Processes references starting with `$self`, which are intended to target other query elements.
@@ -585,6 +577,10 @@ function _infer(originalQuery, model, useTechnicalAlias = true) {
585
577
  if ((!definition.target && definition.kind !== 'entity') || (!inFrom && !inCalcElement && danglingFilter))
586
578
  throw new Error('A filter can only be provided when navigating along associations')
587
579
  if (!inFrom && !arg.expand)defineProperty(arg, 'isJoinRelevant', true)
580
+ // The filter of an `expand` becomes the `where` of the expand subquery.
581
+ // Just like `where exists <assoc>[…]` semi-joins, path expressions in it are
582
+ // resolved via joins inside that subquery, so they must not be rejected here.
583
+ const filterOfExpand = !!arg.expand
588
584
  let skipJoinsForFilter = false
589
585
  step.where.forEach(token => {
590
586
  if (token === 'exists') {
@@ -595,7 +591,7 @@ function _infer(originalQuery, model, useTechnicalAlias = true) {
595
591
  // because they will become part of an EXISTS subquery
596
592
  inferArg(token, false, arg.$refLinks[i], {
597
593
  ...context,
598
- inExists: skipJoinsForFilter || inExists || (inFrom && !danglingFilter),
594
+ inExists: skipJoinsForFilter || inExists || filterOfExpand || (inFrom && !danglingFilter),
599
595
  inXpr: !!token.xpr,
600
596
  inInfixFilter: true,
601
597
  inFrom,
@@ -605,7 +601,7 @@ function _infer(originalQuery, model, useTechnicalAlias = true) {
605
601
  applyToFunctionArgs(token.args, inferArg, [
606
602
  false,
607
603
  arg.$refLinks[i],
608
- { inExists: skipJoinsForFilter || inExists || (inFrom && !danglingFilter), inXpr: true, inInfixFilter: true, inFrom },
604
+ { inExists: skipJoinsForFilter || inExists || filterOfExpand || (inFrom && !danglingFilter), inXpr: true, inInfixFilter: true, inFrom },
609
605
  ])
610
606
  }
611
607
  }
@@ -639,7 +635,7 @@ function _infer(originalQuery, model, useTechnicalAlias = true) {
639
635
  } else if (arg.inline && queryElements) {
640
636
  const elements = resolveInline(arg)
641
637
  for (const elName in elements) {
642
- if (queryElements[elName] !== undefined) rejectDuplicatedElement(elName)
638
+ if (queryElements[elName] !== undefined) rejectDuplicatedElement(elName)
643
639
  }
644
640
  Object.assign(queryElements, elements)
645
641
  } else {
@@ -675,7 +671,7 @@ function _infer(originalQuery, model, useTechnicalAlias = true) {
675
671
  // ignore whole expand if target of assoc along path has ”@cds.persistence.skip”
676
672
  if (arg.expand) {
677
673
  const { $refLinks } = arg
678
-
674
+
679
675
  const skip = $refLinks.some(link => {
680
676
  const def = getDefinition(link.definition.target)
681
677
  return hasOwnSkip(def) && !isRuntimeView(def)
@@ -1295,7 +1291,4 @@ function getMainAlias (query) {
1295
1291
  return mainAlias
1296
1292
  }
1297
1293
 
1298
- // guardEntry bounds nested-subquery re-entry (expand, from, set)
1299
- const infer = guardEntry(_infer)
1300
-
1301
1294
  module.exports = infer