@sap/cds-dk 7.9.5 → 8.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (283) hide show
  1. package/CHANGELOG.md +2116 -0
  2. package/bin/add.js +18 -52
  3. package/bin/bind.js +2 -2
  4. package/bin/build.js +29 -4
  5. package/bin/cds.js +23 -11
  6. package/bin/compile/index.js +7 -6
  7. package/bin/completion/index.js +70 -46
  8. package/bin/completion/scripts/cds-bash.sh +4 -1
  9. package/bin/completion/scripts/cds-fish.fish +13 -0
  10. package/bin/completion/scripts/cds-ps.ps1 +2 -1
  11. package/bin/completion/scripts/cds-zsh.sh +2 -1
  12. package/bin/deploy/index.js +6 -5
  13. package/bin/deploy/to-sqlite.js +2 -2
  14. package/bin/extend.js +19 -50
  15. package/bin/help.js +2 -2
  16. package/bin/init.js +10 -77
  17. package/bin/login.js +13 -5
  18. package/bin/migrate.js +1 -1
  19. package/bin/pull.js +11 -0
  20. package/bin/repl.js +3 -0
  21. package/bin/test.js +5 -0
  22. package/bin/version.js +7 -7
  23. package/bin/watch.js +1 -10
  24. package/lib/bind/KubernetesApiAccessor.js +10 -9
  25. package/lib/build/buildTaskEngine.js +11 -7
  26. package/lib/build/buildTaskFactory.js +15 -43
  27. package/lib/build/buildTaskProviderFactory.js +16 -44
  28. package/lib/build/constants.js +3 -3
  29. package/lib/build/index.js +2 -2
  30. package/lib/build/{buildPlugin.js → plugin.js} +65 -46
  31. package/lib/{init/template/helm/files → build/plugins/helm/files/subcharts}/content-deployment/Chart.yaml +1 -1
  32. package/lib/{init/template/helm/files → build/plugins/helm/files/subcharts}/content-deployment/values.yaml +1 -1
  33. package/lib/{init/template/helm/files → build/plugins/helm/files/subcharts}/service-instance/Chart.yaml +1 -1
  34. package/lib/{init/template/helm/files → build/plugins/helm/files/subcharts}/service-instance/templates/_helpers.tpl +7 -0
  35. package/lib/build/plugins/helm/files/subcharts/service-instance/templates/servicebinding.yaml +32 -0
  36. package/lib/{init/template/helm/files → build/plugins/helm/files/subcharts}/service-instance/templates/serviceinstance.yaml +3 -0
  37. package/lib/{init/template/helm/files → build/plugins/helm/files/subcharts}/service-instance/values.schema.json +63 -0
  38. package/lib/{init/template/helm/files → build/plugins/helm/files/subcharts}/service-instance/values.yaml +23 -1
  39. package/lib/{init/template/helm/files → build/plugins/helm/files/subcharts}/web-application/Chart.yaml +1 -1
  40. package/lib/{init/template/helm/files → build/plugins/helm/files/subcharts}/web-application/templates/deployment.yaml +2 -0
  41. package/lib/build/plugins/helm/files/subcharts/web-application/templates/hpa.yaml +22 -0
  42. package/lib/{init/template/helm/files → build/plugins/helm/files/subcharts}/web-application/templates/pod-disruption-budget.yaml +1 -0
  43. package/lib/{init/template/helm/files → build/plugins/helm/files/subcharts}/web-application/values.schema.json +49 -0
  44. package/lib/{init/template/helm/files → build/plugins/helm/files/subcharts}/web-application/values.yaml +8 -2
  45. package/lib/{init/template/helm/files/chart → build/plugins/helm/files}/templates/_deployment_helpers.tpl +5 -0
  46. package/lib/build/plugins/helm/files/templates/_helpers.tpl +13 -0
  47. package/lib/build/plugins/helm/index.js +81 -0
  48. package/lib/build/plugins.js +12 -15
  49. package/lib/build/provider/featureToggleBuildPlugin.js +7 -39
  50. package/lib/build/provider/hana/2migration.js +168 -124
  51. package/lib/build/provider/hana/index.js +20 -25
  52. package/lib/build/provider/hana/template/package.json +4 -3
  53. package/lib/build/provider/internalBuildPlugin.js +32 -97
  54. package/lib/build/provider/internalBuildTaskProvider.js +10 -46
  55. package/lib/build/provider/java/index.js +2 -3
  56. package/lib/build/provider/mtx/index.js +5 -4
  57. package/lib/build/provider/mtx-extension/index.js +5 -2
  58. package/lib/build/provider/mtx-sidecar/index.js +2 -2
  59. package/lib/build/util.js +83 -12
  60. package/lib/compile/to-mermaid.js +108 -0
  61. package/lib/compile/to_asyncapi.js +7 -0
  62. package/lib/compile/to_openapi.js +7 -0
  63. package/lib/deploy/to-hana/hana.js +37 -34
  64. package/lib/deploy/to-hana/hdiDeployUtil.js +8 -6
  65. package/lib/env/schemas/cds-rc.js +1 -1
  66. package/lib/import/common.js +2 -2
  67. package/lib/import/odata/metadataconverter/MetadataConverter.js +4 -4
  68. package/lib/import/odata/v2parser.js +83 -197
  69. package/lib/import/odata/v4parser.js +1 -38
  70. package/lib/import/openapi/importOpenAPI.js +164 -42
  71. package/lib/index.js +10 -12
  72. package/lib/init/bas.js +91 -0
  73. package/lib/init/constants.js +16 -10
  74. package/lib/init/index.js +72 -150
  75. package/lib/init/merge.js +12 -20
  76. package/lib/init/mvn.js +103 -150
  77. package/lib/init/plugin.js +11 -7
  78. package/lib/init/projectReader.js +53 -19
  79. package/lib/init/registries/mta.js +51 -6
  80. package/lib/init/template/application-logging/files/package.json.hbs +7 -0
  81. package/lib/init/template/application-logging/index.js +13 -1
  82. package/lib/init/template/approuter/files/containerize.yaml.hbs +10 -0
  83. package/lib/init/template/approuter/files/mta.yaml.hbs +1 -2
  84. package/lib/init/template/approuter/files/values.yaml.hbs +19 -4
  85. package/lib/init/template/approuter/files/xs-app.json.hbs +12 -3
  86. package/lib/init/template/approuter/index.js +29 -25
  87. package/lib/init/template/attachments/files/mta.yaml.hbs +14 -0
  88. package/lib/init/template/attachments/files/package.json.hbs +5 -0
  89. package/lib/init/template/attachments/files/values.yaml +7 -0
  90. package/lib/init/template/attachments/index.js +53 -0
  91. package/lib/init/template/audit-logging/files/mta.yaml.hbs +14 -0
  92. package/lib/init/template/audit-logging/files/package.json.hbs +7 -0
  93. package/lib/init/template/audit-logging/index.js +66 -0
  94. package/lib/init/template/cf-manifest/index.js +4 -0
  95. package/lib/init/template/completion/completionSetup.js +54 -33
  96. package/lib/init/template/completion/index.js +7 -1
  97. package/lib/init/template/connectivity/index.js +4 -4
  98. package/lib/init/template/containerize/files/containerize.yaml.hbs +26 -0
  99. package/lib/init/template/containerize/index.js +24 -0
  100. package/lib/init/template/data/index.js +4 -0
  101. package/lib/init/template/destination/files/mta.yaml.hbs +25 -1
  102. package/lib/init/template/destination/index.js +12 -2
  103. package/lib/init/template/enterprise-messaging/index.js +6 -3
  104. package/lib/init/template/enterprise-messaging-shared/index.js +5 -1
  105. package/lib/init/template/extensibility/files/package.json.hbs +1 -1
  106. package/lib/init/template/extensibility/files/xs-security.json.hbs +2 -8
  107. package/lib/init/template/extensibility/index.js +3 -1
  108. package/lib/init/template/file-based-messaging/index.js +4 -0
  109. package/lib/init/template/h2/index.js +4 -0
  110. package/lib/init/template/hana/files/containerize.yaml.hbs +10 -0
  111. package/lib/init/template/hana/files/db/package.json +3 -2
  112. package/lib/init/template/hana/files/package.json.hbs +4 -7
  113. package/lib/init/template/hana/files/values.yaml.hbs +1 -2
  114. package/lib/init/template/hana/index.js +15 -7
  115. package/lib/init/template/helm/files/Chart.yaml.hbs +2 -3
  116. package/lib/init/template/helm/files/values.schema.json +2173 -0
  117. package/lib/init/template/helm/files/values.yaml.hbs +11 -6
  118. package/lib/init/template/helm/index.js +77 -18
  119. package/lib/init/template/helm-unified-runtime/index.js +19 -56
  120. package/lib/init/template/html5-repo/files/app-package.json.hbs +11 -7
  121. package/lib/init/template/html5-repo/files/manifest.json +13 -0
  122. package/lib/init/template/html5-repo/files/mta.yaml.hbs +41 -8
  123. package/lib/init/template/html5-repo/files/ui5-deploy.yaml.hbs +21 -0
  124. package/lib/init/template/html5-repo/files/ui5.yaml.hbs +2 -29
  125. package/lib/init/template/html5-repo/files/values.yaml.hbs +6 -2
  126. package/lib/init/template/html5-repo/files/xs-app.json.hbs +21 -8
  127. package/lib/init/template/html5-repo/index.js +33 -30
  128. package/lib/init/template/http/index.js +36 -12
  129. package/lib/init/template/java/index.js +18 -12
  130. package/lib/init/template/kafka/index.js +4 -0
  131. package/lib/init/template/lint/index.js +7 -2
  132. package/lib/init/template/liquibase/index.js +4 -0
  133. package/lib/init/template/local-messaging/index.js +4 -0
  134. package/lib/init/template/malware-scanner/files/mta.yaml.hbs +14 -0
  135. package/lib/init/template/malware-scanner/files/package.json.hbs +17 -0
  136. package/lib/init/template/malware-scanner/files/values.yaml +7 -0
  137. package/lib/init/template/malware-scanner/index.js +47 -0
  138. package/lib/init/template/mta/files/mta.yaml.hbs +3 -3
  139. package/lib/init/template/mta/files/package.json +1 -1
  140. package/lib/init/template/mta/index.js +4 -0
  141. package/lib/init/template/mtx/index.js +4 -0
  142. package/lib/init/template/multitenancy/files/containerize.yaml.hbs +10 -0
  143. package/lib/init/template/multitenancy/files/mta.yaml.hbs +0 -1
  144. package/lib/init/template/multitenancy/files/package.json.hbs +1 -1
  145. package/lib/init/template/multitenancy/files/package.sidecar.json.hbs +6 -5
  146. package/lib/init/template/multitenancy/files/values.yaml.hbs +14 -24
  147. package/lib/init/template/multitenancy/index.js +50 -28
  148. package/lib/init/template/nodejs/files/eslint.config.mjs +2 -0
  149. package/lib/init/template/nodejs/files/package.json.hbs +2 -3
  150. package/lib/init/template/nodejs/index.js +4 -0
  151. package/lib/init/template/notifications/files/mta.yaml.hbs +2 -2
  152. package/lib/init/template/notifications/index.js +4 -0
  153. package/lib/init/template/pipeline/files/.pipeline/config.yml +1 -1
  154. package/lib/init/template/pipeline/files/Jenkinsfile +1 -1
  155. package/lib/init/template/pipeline/index.js +4 -0
  156. package/lib/init/template/portal/files/mta.yaml.hbs +52 -0
  157. package/lib/init/template/portal/files/package.json.hbs +11 -0
  158. package/lib/init/template/portal/files/package.sidecar.json +7 -0
  159. package/lib/init/template/portal/files/portal-site/CommonDataModel.json.hbs +97 -0
  160. package/lib/init/template/portal/files/portal-site/i18n/catalog.properties +1 -0
  161. package/lib/init/template/portal/files/portal-site/i18n/catalog_de.properties +1 -0
  162. package/lib/init/template/portal/files/portal-site/i18n/group.properties +1 -0
  163. package/lib/init/template/portal/files/portal-site/i18n/group_de.properties +1 -0
  164. package/lib/init/template/portal/index.js +84 -0
  165. package/lib/init/template/postgres/index.js +5 -1
  166. package/lib/init/template/redis-messaging/index.js +4 -0
  167. package/lib/init/template/sample/files/app/admin-books/webapp/i18n/i18n_de.properties +3 -0
  168. package/lib/init/template/sample/files/app/admin-books/webapp/i18n/i18n_en.properties +3 -0
  169. package/lib/init/template/sample/files/app/admin-books/webapp/manifest.json +13 -1
  170. package/lib/init/template/sample/files/app/browse/webapp/i18n/i18n.properties +2 -2
  171. package/lib/init/template/sample/files/app/browse/webapp/i18n/i18n_de.properties +3 -0
  172. package/lib/init/template/sample/files/app/browse/webapp/i18n/i18n_en.properties +4 -0
  173. package/lib/init/template/sample/files/app/browse/webapp/manifest.json +3 -3
  174. package/lib/init/template/sample/files/app/index.html +1 -1
  175. package/lib/init/template/sample/files/db/data/sap.capire.bookshop-Authors.csv +5 -5
  176. package/lib/init/template/sample/files/db/data/sap.capire.bookshop-Books.csv +6 -6
  177. package/lib/init/template/sample/files/db/data/sap.capire.bookshop-Books_texts.csv +5 -5
  178. package/lib/init/template/sample/files/db/data/sap.capire.bookshop-Genres.csv +16 -16
  179. package/lib/init/template/sample/files/nodejs/cat-service.js +2 -2
  180. package/lib/init/template/sample/files/package.json.hbs +3 -0
  181. package/lib/init/template/sample/index.js +16 -9
  182. package/lib/init/template/sqlite/index.js +4 -0
  183. package/lib/init/template/tiny-sample/files/nodejs/db/data/my.bookshop-Books.csv +3 -3
  184. package/lib/init/template/tiny-sample/files/nodejs/srv/cat-service.cds.hbs +1 -1
  185. package/lib/init/template/tiny-sample/index.js +4 -0
  186. package/lib/init/template/toggles/files/package.json.hbs +1 -1
  187. package/lib/init/template/toggles/index.js +4 -0
  188. package/lib/init/template/typer/index.js +4 -0
  189. package/lib/init/template/typescript/files/package.json +12 -0
  190. package/lib/init/template/typescript/files/tsconfig.json +13 -0
  191. package/lib/init/template/typescript/index.js +39 -0
  192. package/lib/init/template/workzone/index.js +5 -0
  193. package/lib/init/template/workzone-standard/files/manifest.json.hbs +6 -0
  194. package/lib/init/template/workzone-standard/index.js +30 -0
  195. package/lib/init/template/xsuaa/files/package.json.hbs +1 -1
  196. package/lib/init/template/xsuaa/files/values.yaml.hbs +3 -2
  197. package/lib/init/template/xsuaa/index.js +11 -7
  198. package/lib/init/validate.js +27 -0
  199. package/lib/lint/generators.js +1 -1
  200. package/lib/lint/io.js +25 -7
  201. package/lib/mtx/auth_manager.js +64 -30
  202. package/lib/mtx/download_legacy.js +2 -2
  203. package/lib/mtx/index.js +0 -4
  204. package/lib/mtx/params.js +32 -38
  205. package/lib/mtx/pull.js +151 -43
  206. package/lib/mtx/push.js +3 -3
  207. package/lib/mtx/settings_manager.js +75 -35
  208. package/lib/mtx/tenant_action.js +1 -1
  209. package/lib/mtx/util/cf.js +1 -1
  210. package/lib/mtx/util/fs.js +26 -1
  211. package/lib/mtx/util/logging.js +7 -3
  212. package/lib/util/command.js +0 -2
  213. package/lib/util/fs.js +2 -3
  214. package/lib/util/question.js +28 -0
  215. package/lib/util/term.js +5 -3
  216. package/npm-shrinkwrap.json +226 -1087
  217. package/package.json +13 -8
  218. package/bin/activate.js +0 -77
  219. package/lib/compile/asyncapi/channels.js +0 -22
  220. package/lib/compile/asyncapi/components/messageTraits/index.js +0 -89
  221. package/lib/compile/asyncapi/components/messages/index.js +0 -173
  222. package/lib/compile/asyncapi/components/schemas/annotations.js +0 -33
  223. package/lib/compile/asyncapi/components/schemas/array.js +0 -8
  224. package/lib/compile/asyncapi/components/schemas/cache.js +0 -14
  225. package/lib/compile/asyncapi/components/schemas/definition.js +0 -187
  226. package/lib/compile/asyncapi/components/schemas/enum.js +0 -16
  227. package/lib/compile/asyncapi/components/schemas/examples.js +0 -10
  228. package/lib/compile/asyncapi/components/schemas/index.js +0 -14
  229. package/lib/compile/asyncapi/components/schemas/localized.js +0 -29
  230. package/lib/compile/asyncapi/components/schemas/primitiveElement.js +0 -41
  231. package/lib/compile/asyncapi/components/schemas/ref.js +0 -45
  232. package/lib/compile/asyncapi/components/schemas/utils.js +0 -108
  233. package/lib/compile/asyncapi/index.js +0 -247
  234. package/lib/compile/asyncapi/message.js +0 -13
  235. package/lib/compile/asyncapi/utils.js +0 -27
  236. package/lib/compile/openapi/csdl2openapi.js +0 -2448
  237. package/lib/compile/openapi/index.js +0 -68
  238. package/lib/init/template/helm/files/chart/templates/NOTES.txt +0 -14
  239. package/lib/init/template/helm/files/chart/templates/_helpers.tpl +0 -28
  240. package/lib/init/template/helm/files/chart/values.root.schema.json +0 -61
  241. package/lib/init/template/helm/files/chart/values.schema.json +0 -366
  242. package/lib/init/template/helm-unified-runtime/files/Chart.yaml.hbs +0 -10
  243. package/lib/init/template/helm-unified-runtime/files/templates/_deployment_helpers.tpl +0 -90
  244. package/lib/init/template/helm-unified-runtime/files/templates/_helpers.tpl +0 -28
  245. package/lib/init/template/helm-unified-runtime/files/values.root.schema.json +0 -61
  246. package/lib/init/template/helm-unified-runtime/files/values.schema.json +0 -366
  247. package/lib/init/template/helm-unified-runtime/files/values.yaml.hbs +0 -26
  248. package/lib/init/template/helm-unified-runtime/package.json +0 -4
  249. package/lib/init/template/multitenancy/files/mtxs-configmap-java-approuter.yaml +0 -20
  250. package/lib/init/template/multitenancy/files/mtxs-configmap-java.yaml +0 -18
  251. package/lib/init/template/multitenancy/files/mtxs-configmap-nodejs-approuter.yaml +0 -12
  252. package/lib/init/template/multitenancy/files/mtxs-configmap-nodejs.yaml +0 -12
  253. package/lib/init/template/multitenancy/files/saas-registry-secret.yaml +0 -9
  254. package/lib/init/template/nodejs/files/eslint.config.js +0 -13
  255. package/lib/init/template/notebook/index.js +0 -11
  256. package/lib/init/template/samples/index.js +0 -9
  257. package/lib/mtx/activate.js +0 -238
  258. package/lib/mtx/extend.js +0 -173
  259. package/lib/util/exec.d.ts +0 -54
  260. package/lib/util/exec.js +0 -211
  261. /package/lib/{init/template/approuter/files → build/plugins/helm/files/plugins/approuter}/approuter-configmap.yaml +0 -0
  262. /package/lib/{init/template/connectivity/files → build/plugins/helm/files/plugins/connectivity}/connectivity-proxy-info.yaml +0 -0
  263. /package/lib/{init/template/html5-repo/files → build/plugins/helm/files/plugins/html5-repo}/html5-apps-deployer-configmap.yaml +0 -0
  264. /package/lib/{init/template/helm/files → build/plugins/helm/files/subcharts}/content-deployment/templates/_helpers.tpl +0 -0
  265. /package/lib/{init/template/helm/files → build/plugins/helm/files/subcharts}/content-deployment/templates/job.yaml +0 -0
  266. /package/lib/{init/template/helm/files → build/plugins/helm/files/subcharts}/content-deployment/templates/secret.yaml +0 -0
  267. /package/lib/{init/template/helm/files → build/plugins/helm/files/subcharts}/content-deployment/templates/service-account.yaml +0 -0
  268. /package/lib/{init/template/helm/files → build/plugins/helm/files/subcharts}/content-deployment/templates/service-binding.yaml +0 -0
  269. /package/lib/{init/template/helm/files → build/plugins/helm/files/subcharts}/content-deployment/values.schema.json +0 -0
  270. /package/lib/{init/template/helm/files → build/plugins/helm/files/subcharts}/web-application/templates/NOTES.txt +0 -0
  271. /package/lib/{init/template/helm/files → build/plugins/helm/files/subcharts}/web-application/templates/_api.tpl +0 -0
  272. /package/lib/{init/template/helm/files → build/plugins/helm/files/subcharts}/web-application/templates/_helpers.tpl +0 -0
  273. /package/lib/{init/template/helm/files → build/plugins/helm/files/subcharts}/web-application/templates/api-rule.yaml +0 -0
  274. /package/lib/{init/template/helm/files → build/plugins/helm/files/subcharts}/web-application/templates/network-policy.yaml +0 -0
  275. /package/lib/{init/template/helm/files → build/plugins/helm/files/subcharts}/web-application/templates/rbac.yaml +0 -0
  276. /package/lib/{init/template/helm/files → build/plugins/helm/files/subcharts}/web-application/templates/secret.yaml +0 -0
  277. /package/lib/{init/template/helm/files → build/plugins/helm/files/subcharts}/web-application/templates/service-account.yaml +0 -0
  278. /package/lib/{init/template/helm/files → build/plugins/helm/files/subcharts}/web-application/templates/service-binding.yaml +0 -0
  279. /package/lib/{init/template/helm/files → build/plugins/helm/files/subcharts}/web-application/templates/service.yaml +0 -0
  280. /package/lib/{init/template/helm/files → build/plugins/helm/files/subcharts}/web-application/templates/virtual-service.yaml +0 -0
  281. /package/lib/{init/template/helm-unified-runtime → build/plugins/helm}/files/templates/NOTES.txt +0 -0
  282. /package/lib/init/template/{nodejs/files → java}/.cdsrc.json +0 -0
  283. /package/lib/init/template/tiny-sample/files/nodejs/db/{data-model.cds → schema.cds} +0 -0
@@ -1,52 +1,78 @@
1
1
  const path = require('path')
2
2
  const parser = require('./migrationtable')
3
- const { BuildError, hasOptionValue, BuildMessage } = require('../../util')
3
+ const { BuildError, BuildMessage } = require('../../util')
4
4
  const { SEVERITY_WARNING } = require('../../constants')
5
5
  const cds = require('../../../cds'), { compiler: cdsc } = cds
6
6
  const cdscVersion = `-- generated by cds-compiler version ${cdsc.version()}`
7
7
  const { getArtifactCdsPersistenceName } = cdsc
8
- const ANNO_PERSISTENCE_JOURNAL = '@cds.persistence.journal'
9
8
  const DEBUG = cds.debug('cli|build')
10
9
 
11
- module.exports = async (model, lastDevVersion, srcPath, options = {}) => {
12
- const { definitions, deletions, migrations, afterImage, journalFileNames } = _toHdiMigration(model, lastDevVersion, options)
13
- const definitionResult = []
10
+ module.exports = async (model, beforeImage, srcPath, options = {}) => {
11
+ const { definitions, migrations, afterImage, journalFileNames } = _compileToHana(model, options, beforeImage)
12
+ const definitionResult = []
14
13
 
15
- for (const { name, suffix, sql } of definitions) {
16
- let definitionEntry = { name, suffix, content: sql }
14
+ for (const { name, suffix, sql } of definitions) {
15
+ let definitionEntry = { name, suffix, content: sql }
17
16
 
18
- if (suffix === '.hdbtable') {
19
- if (journalFileNames.has(name)) {
20
- const migration = migrations.find(migration => migration.name === name)
21
- definitionEntry = await _2migrationtable(srcPath, migration || _emptyMigration(name), sql)
22
- }
23
- }
24
- if (definitionEntry) {
25
- definitionResult.push(definitionEntry)
17
+ if (suffix === '.hdbtable') {
18
+ if (journalFileNames.has(name)) {
19
+ const migration = migrations.find(migration => migration.name === name)
20
+ definitionEntry = await _2migrationtable(srcPath, migration || _emptyMigration(name), sql)
21
+ }
22
+ }
23
+ if (definitionEntry) {
24
+ definitionResult.push(definitionEntry)
25
+ }
26
26
  }
27
- }
28
- return { definitions: definitionResult, deletions, afterImage: _filterJournalArtifacts(afterImage) }
27
+ return { definitions: definitionResult, afterImage }
29
28
  }
30
29
 
31
- function _toHdiMigration(model, lastDevVersion, options) {
32
- const result = cdsc.to.hdi.migration(cds.minify(model), options, lastDevVersion);
33
- const journalFileNames = _getJournalFileNames(result.afterImage, options);
34
- if (DEBUG) {
35
- DEBUG('cdsc.to.hdi.migration returned')
36
- for (const { name, suffix, sql } of result.definitions) {
37
- if (suffix === '.hdbtable' || suffix === '.hdbmigrationtable') {
38
- if (journalFileNames.has(name)) {
39
- const migration = result.migrations.find(migration => migration.name === name)
40
- DEBUG(`
41
- File ${name + '.hdbmigrationtable'} - ${migration ? migration.changeset.length : 0} new changes
42
- ${sql}
43
- ${migration ? migration.changeset.map(change => change.sql).join('\n') : 'Empty changeset'}
44
- `)
30
+ function _compileToHana(model, options, beforeImage) {
31
+ let definitions = []
32
+ let migrations = []
33
+ let afterImage
34
+
35
+ if (cds.compile.to.hana) {
36
+ const result = cds.compile.to.hana(model, options, beforeImage);
37
+
38
+ for (const [content, { file }] of result) {
39
+ switch (file) {
40
+ case 'deletions.json':
41
+ break
42
+ case 'migrations.json':
43
+ migrations = content
44
+ break
45
+ case 'afterImage.json':
46
+ afterImage = content
47
+ break
48
+ default: {
49
+ const { name, ext: suffix } = path.parse(file)
50
+ definitions.push({ name, suffix, sql: content })
51
+ }
52
+ }
45
53
  }
46
- }
54
+ } else {
55
+ // compatibility with cds < 8.0.0
56
+ const result = cdsc.to.hdi.migration(cds.minify(model), options, beforeImage)
57
+ definitions = result.definitions
58
+ migrations = result.migrations
59
+ afterImage = result.afterImage
60
+ }
61
+ let journalFileNames = new Set()
62
+ if (afterImage) {
63
+ // 1. determine journal file names before _filterJournalArtifacts is called as getArtifactCdsPersistenceName
64
+ // might no longer return the proper file name for the reduced CSN, e.g. for draft entities
65
+ journalFileNames = _getJournalFileNames(afterImage, options)
66
+
67
+ // 2. leave only persisted journal-related entities in afterImage
68
+ afterImage = _filterJournalArtifacts(afterImage)
69
+ }
70
+
71
+ _debug(definitions, migrations, journalFileNames)
72
+
73
+ return {
74
+ definitions, migrations, afterImage, journalFileNames
47
75
  }
48
- }
49
- return { ...result, journalFileNames }
50
76
  }
51
77
 
52
78
  /**
@@ -58,118 +84,136 @@ ${migration ? migration.changeset.map(change => change.sql).join('\n') : 'Empty
58
84
  * @returns {Object} Providing access to 'content' and 'fileName'.
59
85
  */
60
86
  async function _2migrationtable(srcPath, migration, tableSql) {
61
- let migrationTableModel = null
62
- const file = path.join(srcPath, migration.name + migration.suffix)
63
- try {
64
- migrationTableModel = await parser.read(file)
65
- } catch (e) {
66
- // abort build in order to ensure consistent afterImage model state / hdbmigrationtable file state
67
- throw new BuildError(`${path.relative(process.cwd(), file)}: ${e.message}`)
68
- }
69
-
70
- if (migrationTableModel) {
71
- // adding new changeset if change exist, ignore otherwise
72
- const migrationEntry = _getNewMigrationEntry(migration.changeset, migrationTableModel.versionNumber)
73
- if (migrationEntry) {
74
- const versionNumber = migrationTableModel.versionNumber + 1
75
- const migrationCount = migrationTableModel.migrations.entries.length
76
- const migrations = `${migrationEntry.content}${migrationCount > 0 ? '\n' : ''}${migrationTableModel.migrations.toString()}${migrationCount > 0 ? '\n' : ''}`
77
- return {
78
- name: migration.name,
79
- suffix: migration.suffix,
80
- content: `== version=${versionNumber}\n${tableSql}\n\n${migrations}`,
81
- changed: true,
82
- dropColumns: migrationEntry.dropColumns
83
- }
84
- } else {
85
- // existing migration file version
86
- return { name: migration.name, suffix: migration.suffix, content: migrationTableModel.toString(), changed: false }
87
+ let migrationTableModel = null
88
+ const file = path.join(srcPath, migration.name + migration.suffix)
89
+ try {
90
+ migrationTableModel = await parser.read(file)
91
+ } catch (e) {
92
+ // abort build in order to ensure consistent afterImage model state / hdbmigrationtable file state
93
+ throw new BuildError(`${path.relative(process.cwd(), file)}: ${e.message}`)
87
94
  }
88
- }
89
- // initial migration file version
90
- return { name: migration.name, suffix: migration.suffix, content: `== version=1\n${tableSql}\n`, changed: true }
95
+
96
+ if (migrationTableModel) {
97
+ // adding new changeset if change exist, ignore otherwise
98
+ const migrationEntry = _getNewMigrationEntry(migration.changeset, migrationTableModel.versionNumber)
99
+ if (migrationEntry) {
100
+ const versionNumber = migrationTableModel.versionNumber + 1
101
+ const migrationCount = migrationTableModel.migrations.entries.length
102
+ const migrations = `${migrationEntry.content}${migrationCount > 0 ? '\n' : ''}${migrationTableModel.migrations.toString()}${migrationCount > 0 ? '\n' : ''}`
103
+ return {
104
+ name: migration.name,
105
+ suffix: migration.suffix,
106
+ content: `== version=${versionNumber}\n${tableSql}\n\n${migrations}`,
107
+ changed: true,
108
+ dropColumns: migrationEntry.dropColumns
109
+ }
110
+ } else {
111
+ // existing migration file version
112
+ return { name: migration.name, suffix: migration.suffix, content: migrationTableModel.toString(), changed: false }
113
+ }
114
+ }
115
+ // initial migration file version
116
+ return { name: migration.name, suffix: migration.suffix, content: `== version=1\n${tableSql}\n`, changed: true }
91
117
  }
92
118
 
93
119
  function _getNewMigrationEntry(changeset, currentVersion) {
94
- if (changeset && changeset.length > 0) {
95
- const dropColumns = changeset.some(e => e.drop)
96
- const manualChange = changeset.some(e => !e.sql)
97
- const enableDrop = cds.env.hana?.journal?.['enable-drop']
98
- const content = changeset.reduce((acc, e) => {
99
- if (!acc) {
100
- acc = `== migration=${currentVersion + 1}\n`
101
- acc += `${cdscVersion}\n`
102
-
103
- if (dropColumns && enableDrop !== true) {
104
- acc += `>>>>> Manual resolution required - DROP statements causing data loss are disabled by default.
120
+ if (changeset && changeset.length > 0) {
121
+ const dropColumns = changeset.some(e => e.drop)
122
+ const manualChange = changeset.some(e => !e.sql)
123
+ const enableDrop = cds.env.hana?.journal?.['enable-drop']
124
+ const content = changeset.reduce((acc, e) => {
125
+ if (!acc) {
126
+ acc = `== migration=${currentVersion + 1}\n`
127
+ acc += `${cdscVersion}\n`
128
+
129
+ if (dropColumns && enableDrop !== true) {
130
+ acc += `>>>>> Manual resolution required - DROP statements causing data loss are disabled by default.
105
131
  >>>>> You may either:
106
132
  >>>>> uncomment statements to allow incompatible changes, or
107
133
  >>>>> refactor statements, e.g. replace DROP/ADD by single RENAME statement
108
134
  >>>>> After manual resolution delete all lines starting with >>>>>\n`
109
- } else if (manualChange) {
110
- acc += `>>>>> Manual resolution required - insert ALTER statement(s) as described below.
135
+ } else if (manualChange) {
136
+ acc += `>>>>> Manual resolution required - insert ALTER statement(s) as described below.
111
137
  >>>>> After manual resolution delete all lines starting with >>>>>\n`
112
- }
113
- }
114
- if (e.sql) {
115
- if (e.drop && enableDrop !== true) {
116
- acc += `${e.sql.replace(/^/gm, '-- ')}\n`;
117
- } else {
118
- acc += `${e.sql}\n`
119
- }
120
- } else {
121
- acc +=
122
- `>>>>> Insert ALTER statement for: ${e.description}\n`
123
- }
124
- return acc
125
- }, null)
126
- return { dropColumns, content }
127
- }
128
- return null
138
+ }
139
+ }
140
+ if (e.sql) {
141
+ if (e.drop && enableDrop !== true) {
142
+ acc += `${e.sql.replace(/^/gm, '-- ')}\n`;
143
+ } else {
144
+ acc += `${e.sql}\n`
145
+ }
146
+ } else {
147
+ acc +=
148
+ `>>>>> Insert ALTER statement for: ${e.description}\n`
149
+ }
150
+ return acc
151
+ }, null)
152
+ return { dropColumns, content }
153
+ }
154
+ return null
129
155
  }
130
156
 
131
157
  function _emptyMigration(name) {
132
- return { name, suffix: ".hdbmigrationtable", changeset: [] }
158
+ return { name, suffix: ".hdbmigrationtable", changeset: [] }
133
159
  }
134
160
 
135
161
  function _getJournalFileNames(model, options) {
136
- const journalNames = new Set(cds.reflect(model).all(item => {
137
- if (item.kind === 'entity' && item[ANNO_PERSISTENCE_JOURNAL] === true) {
138
- if (item['@cds.persistence.skip'] === true || item['@cds.persistence.exists'] === true) {
139
- options.messages?.push(new BuildMessage(`[hdbmigrationtable] annotation @cds.persistence.journal skipped for entity '${item.name}' as persistence exists`, SEVERITY_WARNING))
140
- }
141
- return true
142
- }
143
- return false
144
- }).map(entity => getArtifactCdsPersistenceName(entity.name, 'quoted', model, 'hana')))
162
+ const journalNames = new Set(cds.reflect(model).all(item => {
163
+ if (item.kind === 'entity' && item['@cds.persistence.journal'] === true) {
164
+ if (item['@cds.persistence.skip'] === true || item['@cds.persistence.exists'] === true) {
165
+ options.messages?.push(new BuildMessage(`[hdbmigrationtable] annotation @cds.persistence.journal skipped for entity '${item.name}' as persistence exists`, SEVERITY_WARNING))
166
+ }
167
+ return true
168
+ }
169
+ return false
170
+ }).map(entity => getArtifactCdsPersistenceName(entity.name, 'quoted', model, 'hana')))
145
171
 
146
- DEBUG?.(`\n[hdbmigrationtable] found ${journalNames.size} model entities annotated with '@cds.persistence.journal`)
147
- DEBUG?.(`[hdbmigrationtable] ${[...journalNames].join(', ')}\n`)
172
+ DEBUG?.(`\n[hdbmigrationtable] found ${journalNames.size} model entities annotated with '@cds.persistence.journal`)
173
+ DEBUG?.(`[hdbmigrationtable] ${[...journalNames].join(', ')}\n`)
148
174
 
149
- return journalNames
175
+ return journalNames
150
176
  }
151
177
 
152
- // delete all entities that are not relevant
153
- function _filterJournalArtifacts(csn) {
154
- if (!csn) {
155
- return
156
- }
157
- const dict = csn.definitions
158
- for (const name in dict) {
159
- if (!_isPersistedAsJournalTable(dict[name])) {
160
- delete dict[name]
178
+ // only keep journal related entities
179
+ function _filterJournalArtifacts(afterImage) {
180
+ if (!afterImage) {
181
+ return
161
182
  }
162
- }
163
- // mark CSN as modified by cds build
164
- csn.meta.build = `CDS Build v${cds.version}`
165
- return csn;
183
+ const dict = afterImage.definitions
184
+ for (const name in dict) {
185
+ if (!_isPersistedAsJournalTable(dict[name])) {
186
+ delete dict[name]
187
+ }
188
+ }
189
+ // mark CSN as modified by cds
190
+ afterImage.meta.build = `CDS Build v${cds.version}`
191
+ return afterImage
166
192
  }
167
193
 
168
194
  // see cds-compiler/lib/model/csnUtils.js#isPersistedAsTable
169
195
  function _isPersistedAsJournalTable(artifact) {
170
- return artifact.kind === 'entity' && hasOptionValue(artifact['@cds.persistence.journal'], true) &&
171
- !artifact.abstract &&
172
- !hasOptionValue(artifact['@cds.persistence.skip'], true) &&
173
- !hasOptionValue(artifact['@cds.persistence.exists'], true) &&
174
- (!artifact.query && !artifact.projection || hasOptionValue(artifact['@cds.persistence.table'], true))
196
+ return (
197
+ artifact.kind === 'entity' &&
198
+ artifact['@cds.persistence.journal'] &&
199
+ !artifact.abstract &&
200
+ !artifact['@cds.persistence.skip'] &&
201
+ !artifact['@cds.persistence.exists'] &&
202
+ ((!artifact.query && !artifact.projection) || artifact['@cds.persistence.table'])
203
+ )
204
+ }
205
+
206
+ function _debug(definitions, migrations, journalFileNames) {
207
+ if (DEBUG) {
208
+ DEBUG('compile.to.hana returned')
209
+ for (const { name, suffix, sql } of definitions) {
210
+ if (suffix === '.hdbtable' && journalFileNames.has(name)) {
211
+ const migration = migrations.find(migration => migration.name === name)
212
+ DEBUG(`File ${name + '.hdbmigrationtable'} - ${migration ? migration.changeset.length : 0} new changes
213
+ ${sql}
214
+ ${migration ? migration.changeset.map(change => change.sql).join('\n') : 'Empty changeset'}
215
+ `)
216
+ }
217
+ }
218
+ }
175
219
  }
@@ -3,10 +3,10 @@ const path = require('path')
3
3
  const cds = require('../../../cds')
4
4
  const to_hdbmigration = require('./2migration')
5
5
  const InternalBuildPlugin = require('../internalBuildPlugin')
6
- const { BuildError, relativePaths, BuildMessage, getWorkspaces, hasOptionValue } = require('../../util')
6
+ const { BuildError, relativePaths, BuildMessage, getWorkspaces, hasOptionValue, getFiles } = require('../../util')
7
7
  const { OUTPUT_MODE_NONE, OUTPUT_MODE, CONTENT_PACKAGE_JSON, CONTENT_HDBTABLEDATA, CSV_FILE_DETECTION,
8
8
  CONTENT_ENV, CONTENT_DEFAULT_ENV_JSON, CONTENT_NODE_MODULES, OUTPUT_MODE_RESULT, CONTINUE_UNRESOLVED_SCHEMA_CHANGES,
9
- CSV_FILE_TARGET, CONTENT_WS } = require('../../constants')
9
+ CSV_FILE_TARGET, OPTION_WS} = require('../../constants')
10
10
  const { WARNING } = InternalBuildPlugin
11
11
  const DEFAULT_COMPILE_DEST_FOLDER = path.normalize("src/gen")
12
12
  const FILE_EXT_CSV = ".csv"
@@ -50,7 +50,7 @@ class HanaBuildPlugin extends InternalBuildPlugin {
50
50
  await this._copyResourcesExt(src, dest, model)
51
51
  }
52
52
  // copy native hana artifacts from workspace dependencies
53
- if (cds.cli.options?.ws || hasOptionValue(this.task.options?.[CONTENT_WS], true)) {
53
+ if (cds.cli.options?.[OPTION_WS] || hasOptionValue(this.task.options?.[OPTION_WS], true)) {
54
54
  await this._addWorkspaceContent()
55
55
  }
56
56
 
@@ -163,9 +163,10 @@ class HanaBuildPlugin extends InternalBuildPlugin {
163
163
  })
164
164
  }
165
165
 
166
- // handle *.csv and *.hdbtabledata located in '<dbSrc>/data' and '<dbSrc>/csv' folder
166
+ // handle *.csv and *.hdbtabledata located in '<dbSrc>/data' and '<dbSrc>/csv' folder,
167
+ // subfolders are not supported
167
168
  const allFiles = csvDirs.reduce((acc, csvDir) => {
168
- return acc.concat(InternalBuildPlugin._find(csvDir, (entry) => {
169
+ return acc.concat(getFiles(csvDir, (entry) => {
169
170
  if (fs.statSync(entry).isDirectory()) {
170
171
  return false
171
172
  }
@@ -193,7 +194,7 @@ class HanaBuildPlugin extends InternalBuildPlugin {
193
194
  const tableDataDirs = new Set()
194
195
  const destSrcDir = path.join(this.task.dest, "src")
195
196
 
196
- const allCsvFiles = InternalBuildPlugin._find(destSrcDir, (entry) => {
197
+ const allCsvFiles = getFiles(destSrcDir, (entry) => {
197
198
  if (fs.statSync(entry).isDirectory()) {
198
199
  return true
199
200
  }
@@ -260,8 +261,10 @@ class HanaBuildPlugin extends InternalBuildPlugin {
260
261
  return Promise.reject(new Error(`Invalid deploy-format defined: ${format}`))
261
262
  }
262
263
 
263
- let no_migration = cds.env.features.journal === false || format === 'hdbcds' || Object.values(model.definitions).every(def => !def['@cds.persistence.journal'])
264
- if (no_migration) {
264
+ if (cds.env.features.journal === false
265
+ || format === 'hdbcds'
266
+ || (!cds.compile.to.hana && Object.values(model.definitions).every(def => !def['@cds.persistence.journal']))) {
267
+ // compatibility with existing cds.compile.to.hdbtable plugins cds < 8.0.0
265
268
  return await this._compileToHdb(model, format)
266
269
  } else {
267
270
  return await this._compileToHdbmigration(model, format)
@@ -318,9 +321,7 @@ class HanaBuildPlugin extends InternalBuildPlugin {
318
321
  // enforces sqlNames option for compiler in tests, pass options from cds env, ensures that the correct format is taken
319
322
  const options = { ...this.options(), messages: this.messages, sql_mapping: cds.env.sql.names, "deploy-format": format }
320
323
 
321
- const compilationResult = await to_hdbmigration(model, lastDev, dbSrcDir, options)
322
- const definitions = compilationResult.definitions
323
- const afterImage = compilationResult.afterImage
324
+ const { definitions, afterImage } = await to_hdbmigration(model, lastDev, dbSrcDir, options)
324
325
  let validationError
325
326
 
326
327
  for (const { name, suffix, content, changed } of definitions) {
@@ -354,7 +355,6 @@ class HanaBuildPlugin extends InternalBuildPlugin {
354
355
  // cds build command is again executed
355
356
  await Promise.all(promises)
356
357
 
357
- // ensure
358
358
  try {
359
359
  if (validationError) {
360
360
  throw validationError
@@ -363,21 +363,16 @@ class HanaBuildPlugin extends InternalBuildPlugin {
363
363
  } finally {
364
364
  // update last-dev CSN version
365
365
  if (afterImage) {
366
- if (migrationTableFiles.length > 0) {
367
- if (!HanaBuildPlugin._toEqualIgnoreMeta(lastDev, afterImage)) {
368
- await this.write(afterImage).to(lastDevCsnDir)
369
- }
370
- // add src/.hdiconfig if not existing
371
- if (!fs.existsSync(path.join(dbSrcDir, FILE_NAME_HDICONFIG))) {
372
- const template = await HanaBuildPlugin._readTemplateAsJson('.hdiconfig-cloud')
373
- await this.write(template).to(path.join(dbSrcDir, FILE_NAME_HDICONFIG))
374
- }
366
+ if (!HanaBuildPlugin._toEqualIgnoreMeta(lastDev, afterImage)) {
367
+ await this.write(afterImage).to(lastDevCsnDir)
368
+ }
369
+ // add src/.hdiconfig if not existing
370
+ if (migrationTableFiles.length > 0 && !fs.existsSync(path.join(dbSrcDir, FILE_NAME_HDICONFIG))) {
371
+ const template = await HanaBuildPlugin._readTemplateAsJson('.hdiconfig-cloud')
372
+ await this.write(template).to(path.join(dbSrcDir, FILE_NAME_HDICONFIG))
375
373
  }
376
374
  }
377
375
  }
378
- if (!afterImage) {
379
- throw new BuildError(`Inconsistent CDS compilation results - file ${lastDevCsnFolder} missing`)
380
- }
381
376
  return hdiPlugins
382
377
  }
383
378
 
@@ -507,7 +502,7 @@ class HanaBuildPlugin extends InternalBuildPlugin {
507
502
 
508
503
  async _validateMigrationTableFiles() {
509
504
  const dbSrcDir = path.join(this.task.src, "src")
510
- const migrationTableFiles = InternalBuildPlugin._find(dbSrcDir, (res) => {
505
+ const migrationTableFiles = getFiles(dbSrcDir, (res) => {
511
506
  return fs.statSync(res).isFile() && path.extname(res) === FILE_EXT_HDBMIGRATIONTABLE
512
507
  })
513
508
  if (migrationTableFiles.length > 0) {
@@ -1,12 +1,13 @@
1
1
  {
2
2
  "name": "deploy",
3
3
  "dependencies": {
4
- "@sap/hdi-deploy": "^4"
4
+ "hdb": "^0",
5
+ "@sap/hdi-deploy": "^5"
5
6
  },
6
7
  "engines": {
7
- "node": "^16 || ^18 || ^20"
8
+ "node": "^18 || ^20"
8
9
  },
9
10
  "scripts": {
10
- "start": "node node_modules/@sap/hdi-deploy/deploy.js"
11
+ "start": "node node_modules/@sap/hdi-deploy/deploy.js --use-hdb"
11
12
  }
12
13
  }
@@ -1,42 +1,33 @@
1
1
  const fs = require('fs')
2
2
  const path = require('path')
3
3
  const cds = require('../../cds')
4
- const BuildPlugin = require('../buildPlugin')
5
- const { hasOptionValue } = require('../util')
6
- const { FOLDER_GEN } = require('../constants')
4
+ const Plugin = require('../plugin')
5
+ const { hasOptionValue, getFiles } = require('../util')
6
+ const { FOLDER_GEN, DEFAULT_BUILTIN_PRIORITY_MAX } = require('../constants')
7
7
 
8
- class InternalBuildPlugin extends BuildPlugin {
8
+ class InternalBuildPlugin extends Plugin {
9
9
  /**
10
- * Custom build plugins are executed before internal build plugins in order
11
- * ensure and content cannot be overwritten by mistake.
10
+ * By default custom build plugins are executed before internal build plugins
11
+ * to ensure built-in plugin content isn't overwritten by mistake.
12
12
  */
13
13
  get priority() {
14
- return InternalBuildPlugin.PRIORITY_MAX_VALUE
14
+ return DEFAULT_BUILTIN_PRIORITY_MAX / 2
15
15
  }
16
16
 
17
- init() {
17
+ init() {
18
18
  // REVISIT: no default gen folder for now
19
19
  }
20
20
 
21
21
  async clean() {
22
+ function _isSubDirectory(parent, child) {
23
+ return !path.relative(parent, child).startsWith('..')
24
+ }
22
25
  // build results are deleted by the BuildTaskEngine if the build.target !== '.'
23
26
  // make sure that src is not a subfolder of dest
24
- if (cds.env.build.target === '.' && this.task.src !== this.task.dest && !this._isSubDirectory(this.task.dest, this.task.src)) {
27
+ if (cds.env.build.target === '.' && this.task.src !== this.task.dest && !_isSubDirectory(this.task.dest, this.task.src)) {
25
28
  await fs.promises.rm(this.task.dest, { force: true, recursive: true })
26
29
  }
27
30
  }
28
- /**
29
- * Maximum allowed priority for internal build tasks.
30
- */
31
- static get PRIORITY_MAX_VALUE() {
32
- return 0;
33
- }
34
- /**
35
- * Minimum allowed priority for custom build tasks.
36
- */
37
- static get PRIORITY_MIN_VALUE() {
38
- return Number.MIN_SAFE_INTEGER;
39
- }
40
31
 
41
32
  /**
42
33
  * Called by the framework after {@link #init()}, used to perform more elaborate preparation.
@@ -52,16 +43,6 @@ class InternalBuildPlugin extends BuildPlugin {
52
43
  return false
53
44
  }
54
45
 
55
- /**
56
- * Returns whether cds env has a property with the specified value.
57
- * If the value is omitted the existence of the given property name is checked.
58
- * @param {string} qualifiedName
59
- * @param {any=} value
60
- */
61
- hasCdsEnvOption(qualifiedName, value) {
62
- return hasOptionValue(cds.env.get(qualifiedName), value)
63
- }
64
-
65
46
  /**
66
47
  * Determines whether the given build option value has been set for this build task.
67
48
  * If the value is omitted, the existence of the given property name is checked.
@@ -80,14 +61,6 @@ class InternalBuildPlugin extends BuildPlugin {
80
61
  return super._getBuildOption(qualifiedName)
81
62
  }
82
63
 
83
- /**
84
- * Returns a list of CDS model files defining the transitive closure of the CDS model based on the model options
85
- * defined for this build task.
86
- */
87
- resolveModel() {
88
- return this._resolveModel()
89
- }
90
-
91
64
  /**
92
65
  * Returns whether the build results of this build plugin are created inplace
93
66
  * or in a separate staging folder which is not part of the build tasks src folder.
@@ -97,13 +70,30 @@ class InternalBuildPlugin extends BuildPlugin {
97
70
  }
98
71
 
99
72
  async copyNativeContent(srcDir, destDir, customFilter) {
100
- const files = InternalBuildPlugin._find(srcDir, (src) => {
73
+ function commonStagingBuildFilter(src, destDir) {
74
+ if (typeof src !== "string" || typeof destDir !== "string") {
75
+ return false
76
+ }
77
+ if (!fs.statSync(src).isDirectory()) {
78
+ return true //file
79
+ }
80
+ if (src === destDir) {
81
+ return false
82
+ }
83
+ const regex = new RegExp(FOLDER_GEN + "\\b")
84
+ if (src === path.resolve(cds.root, cds.env.build.target)) {
85
+ return false
86
+ }
87
+ return !regex.exec(path.basename(src))
88
+ }
89
+
90
+ const files = getFiles(srcDir, (src) => {
101
91
  // do not copy files that:
102
92
  // - from 'cds.env.build.target'
103
93
  // - from 'dest'
104
94
  // - from some generation folder
105
- // - do not match filter function
106
- return this._commonStagingBuildFilter(src, destDir) && (!customFilter || customFilter.call(this, src))
95
+ // - do not match filter function ,
96
+ return commonStagingBuildFilter(src, destDir) && (!customFilter || customFilter.call(this, src))
107
97
  })
108
98
  return Promise.all(
109
99
  files.map((srcFile) => {
@@ -165,60 +155,5 @@ class InternalBuildPlugin extends BuildPlugin {
165
155
  }
166
156
  return null
167
157
  }
168
-
169
- _isSubDirectory(parent, child) {
170
- return !path.relative(parent, child).startsWith('..')
171
- }
172
-
173
- _commonStagingBuildFilter(src, destDir) {
174
- if (typeof src !== "string" || typeof destDir !== "string") {
175
- return false
176
- }
177
- if (!fs.statSync(src).isDirectory()) {
178
- return true //file
179
- }
180
- if (src === destDir) {
181
- return false
182
- }
183
- const regex = new RegExp(FOLDER_GEN + "\\b")
184
- if (src === path.resolve(cds.root, cds.env.build.target)) {
185
- return false
186
- }
187
- return !regex.exec(path.basename(src))
188
- }
189
-
190
- static _find(srcDir, filter) {
191
- const files = []
192
- this._traverseFileSystem(srcDir, files, filter)
193
- return files;
194
- }
195
-
196
- static _traverseFileSystem(srcDir, files, filter) {
197
- let entries = []
198
- try {
199
- entries = fs.readdirSync(srcDir)
200
- } catch (e) {
201
- // ignore if not existing
202
- }
203
- entries.map(subDirEntry => path.join(srcDir, subDirEntry)).forEach((entry) => {
204
- this._handleResource(entry, files, filter)
205
- })
206
- }
207
-
208
- static _handleResource(entry, files, filter) {
209
- if (!filter || filter.call(this, entry)) {
210
- var stats = this._getResourceStatus(entry)
211
- if (stats.isDirectory()) {
212
- this._traverseFileSystem(entry, files, filter)
213
- } else if (stats.isFile() || stats.isSymbolicLink()) {
214
- files.push(entry)
215
- }
216
- }
217
- }
218
-
219
- // for testing purposes
220
- static _getResourceStatus(entry) {
221
- return fs.lstatSync(entry)
222
- }
223
158
  }
224
159
  module.exports = InternalBuildPlugin