@sap/cds-dk 6.7.2 → 6.8.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 (122) hide show
  1. package/CHANGELOG.md +21 -0
  2. package/bin/deploy/index.js +1 -1
  3. package/bin/import.js +5 -3
  4. package/bin/login.js +29 -9
  5. package/bin/watch.js +16 -0
  6. package/lib/bind/bindingUtil.js +2 -2
  7. package/lib/bind/userCdsrcJsonStorageProvider.js +1 -1
  8. package/lib/client/auth_manager.js +3 -1
  9. package/lib/client/helper/errors.js +6 -1
  10. package/lib/client/params.js +22 -20
  11. package/lib/client/settings_manager.js +17 -3
  12. package/lib/compile/openapi/csdl2openapi.js +2 -1
  13. package/lib/import/asyncapi/importAsyncAPI.js +32 -0
  14. package/lib/import/asyncapi/index.js +15 -0
  15. package/lib/import/asyncapi/parserContext.js +351 -0
  16. package/lib/import/asyncapi/utils.js +18 -0
  17. package/lib/import/common.js +21 -67
  18. package/lib/import/importapi.js +23 -2
  19. package/lib/import/message.js +11 -1
  20. package/lib/import/odata/index.js +14 -11
  21. package/lib/import/odata/metadataconverter/MetadataConverter.js +35 -35
  22. package/lib/import/odata/util/MultiMap.js +5 -5
  23. package/lib/import/odata/v2parser.js +1 -0
  24. package/lib/import/odata/v4parser.js +1281 -1139
  25. package/lib/init/constants.js +10 -3
  26. package/lib/init/template/_merging/registry-mta.js +33 -36
  27. package/lib/init/template/approuter/files/mtxs-configmap-java.yaml +20 -0
  28. package/lib/init/template/approuter/files/mtxs-configmap-nodejs.yaml +12 -0
  29. package/lib/init/template/approuter/index.js +24 -33
  30. package/lib/init/template/auditlog/files/package.json.hbs +27 -0
  31. package/lib/init/template/auditlog/index.js +12 -6
  32. package/lib/init/template/cf-manifest/index.js +1 -1
  33. package/lib/init/template/connectivity/index.js +1 -1
  34. package/lib/init/template/destinations/index.js +4 -2
  35. package/lib/init/template/enterprise-messaging/files/package.json.hbs +19 -0
  36. package/lib/init/template/enterprise-messaging/index.js +15 -13
  37. package/lib/init/template/enterprise-messaging-shared/files/event-mesh.json.hbs +31 -0
  38. package/lib/init/template/enterprise-messaging-shared/files/mta.yaml.hbs +15 -0
  39. package/lib/init/template/enterprise-messaging-shared/files/package.json.hbs +22 -0
  40. package/lib/init/template/enterprise-messaging-shared/files/values.yaml +7 -0
  41. package/lib/init/template/enterprise-messaging-shared/index.js +51 -0
  42. package/lib/init/template/extensibility/files/package.json.hbs +20 -0
  43. package/lib/init/template/extensibility/index.js +4 -16
  44. package/lib/init/template/file-based-messaging/files/package.json.hbs +19 -0
  45. package/lib/init/template/file-based-messaging/index.js +25 -0
  46. package/lib/init/template/hana/files/package.json.hbs +33 -0
  47. package/lib/init/template/hana/index.js +38 -65
  48. package/lib/init/template/helm/chart/templates/_deployment_helpers.tpl +0 -12
  49. package/lib/init/template/helm/chart/templates/_helpers.tpl +1 -121
  50. package/lib/init/template/helm/index.js +1 -1
  51. package/lib/init/template/html5-repo/index.js +1 -1
  52. package/lib/init/template/java/index.js +2 -2
  53. package/lib/init/template/kibana-logging/files/package.json.hbs +17 -0
  54. package/lib/init/template/kibana-logging/index.js +6 -19
  55. package/lib/init/template/lint/index.js +1 -1
  56. package/lib/init/template/mta/index.js +2 -2
  57. package/lib/init/template/multitenancy/files/mtxs-configmap-java.yaml +3 -5
  58. package/lib/init/template/multitenancy/files/mtxs-configmap-nodejs.yaml +3 -10
  59. package/lib/init/template/multitenancy/files/package.json.hbs +5 -4
  60. package/lib/init/template/multitenancy/index.js +22 -19
  61. package/lib/init/template/nodejs/files/.vscode/launch.json +11 -3
  62. package/lib/init/template/nodejs/index.js +1 -1
  63. package/lib/init/template/pipeline/index.js +1 -1
  64. package/lib/init/template/redis-messaging/files/mta.yaml.hbs +14 -0
  65. package/lib/init/template/redis-messaging/files/package.json.hbs +22 -0
  66. package/lib/init/template/redis-messaging/index.js +50 -0
  67. package/lib/init/template/samples/index.js +3 -3
  68. package/lib/init/template/sqlite/files/package.json.hbs +12 -4
  69. package/lib/init/template/sqlite/index.js +5 -1
  70. package/lib/init/template/toggles/files/package.json.hbs +20 -0
  71. package/lib/init/template/toggles/index.js +3 -9
  72. package/lib/init/template/xsuaa/files/package.json.hbs +28 -0
  73. package/lib/init/template/xsuaa/index.js +8 -23
  74. package/lib/init/util/{md5Tracking.js → md5.js} +1 -1
  75. package/lib/init/util/merge.js +4 -9
  76. package/lib/init/util/{mvnArchetypeUtil.js → mvn.js} +3 -0
  77. package/lib/init/util/projectReader.js +25 -107
  78. package/lib/init/util/xml.js +56 -0
  79. package/lib/lint/checks.js +1 -1
  80. package/lib/lint/io.js +1 -1
  81. package/lib/{init/util/commandUtil.js → util/command.js} +4 -2
  82. package/lib/{init/util/fsUtil.js → util/fs.js} +2 -2
  83. package/npm-shrinkwrap.json +17 -16
  84. package/package.json +5 -4
  85. package/lib/init/template/approuter/files/cds.cdsrc.json +0 -7
  86. package/lib/init/template/approuter/files/cds.cdsrc.json.hbs +0 -9
  87. package/lib/init/template/approuter/files/cds.package.json +0 -9
  88. package/lib/init/template/approuter/files/cds.package.json.hbs +0 -11
  89. package/lib/init/template/auditlog/files/dependencies.package.json +0 -5
  90. package/lib/init/template/enterprise-messaging/files/cds.package.json +0 -9
  91. package/lib/init/template/enterprise-messaging/files/cds.profile.package.json.hbs +0 -11
  92. package/lib/init/template/enterprise-messaging/files/cdsrc.json +0 -7
  93. package/lib/init/template/enterprise-messaging/files/cdsrc.json.hbs +0 -9
  94. package/lib/init/template/extensibility/files/cds.package.json +0 -7
  95. package/lib/init/template/extensibility/files/cds.package.json.hbs +0 -9
  96. package/lib/init/template/extensibility/files/cdsrc.json +0 -5
  97. package/lib/init/template/extensibility/files/cdsrc.json.hbs +0 -7
  98. package/lib/init/template/hana/files/java/cds.json.hbs +0 -7
  99. package/lib/init/template/hana/files/java/cds.profile.json.hbs +0 -12
  100. package/lib/init/template/hana/files/java/cds.shortcut.json.hbs +0 -5
  101. package/lib/init/template/hana/files/java/cds.shortcut.profile.json.hbs +0 -8
  102. package/lib/init/template/hana/files/nodejs/cds.json.hbs +0 -9
  103. package/lib/init/template/hana/files/nodejs/cds.profile.json.hbs +0 -14
  104. package/lib/init/template/hana/files/nodejs/cds.shortcut.json.hbs +0 -7
  105. package/lib/init/template/hana/files/nodejs/cds.shortcut.profile.json.hbs +0 -10
  106. package/lib/init/template/hana/files/nodejs/dependencies.package.json +0 -5
  107. package/lib/init/template/helm/chart/templates/_sapcp_helpers.tpl +0 -103
  108. package/lib/init/template/kibana-logging/files/cds.profile.package.json.hbs +0 -9
  109. package/lib/init/template/toggles/files/cds.package.json +0 -7
  110. package/lib/init/template/toggles/files/cds.package.json.hbs +0 -9
  111. package/lib/init/template/toggles/files/cdsrc.json +0 -5
  112. package/lib/init/template/toggles/files/cdsrc.json.hbs +0 -7
  113. package/lib/init/template/xsuaa/files/cds.cdsrc.json +0 -7
  114. package/lib/init/template/xsuaa/files/cds.cdsrc.json.hbs +0 -9
  115. package/lib/init/template/xsuaa/files/cds.package.json +0 -9
  116. package/lib/init/template/xsuaa/files/cds.package.json.hbs +0 -11
  117. package/lib/init/template/xsuaa/files/dependencies.package.json +0 -6
  118. package/lib/init/util/versionCompare.js +0 -73
  119. /package/lib/init/template/hana/files/{java/db → db}/package.json +0 -0
  120. /package/lib/init/template/hana/files/{common/src → src}/.hdiconfig +0 -0
  121. /package/lib/init/template/hana/files/{common/undeploy.json → undeploy.json} +0 -0
  122. /package/lib/init/util/{templateUtil.js → template.js} +0 -0
@@ -3,13 +3,13 @@ const cds = require('../../../cds')
3
3
  const { exists } = cds.utils
4
4
  const { readProject } = require('../../util/projectReader')
5
5
  const { mergeJSON, mergeYAML, sortDependencies } = require('../../util/merge')
6
- const { copyAndTrack, parseMd5File, writeMd5File } = require('../../util/md5Tracking')
7
- const { copyRenderedJSON } = require('../../util/fsUtil')
6
+ const { copyAndTrack, parseMd5File, writeMd5File } = require('../../util/md5')
7
+ const { copyRenderedJSON } = require('../../../util/fs')
8
8
  const {
9
- srvNode, srvJava, // Server
9
+ srvNode4, srvJava4, // Server
10
10
  mtxSidecar4, // Additional Modules
11
11
  saasRegistry, serviceManager, xsuaa, // BTP Services
12
- srvAPI, providedMtxAPISidecar4, requiredMtxSidecarAPI // APIs
12
+ srvApi4, providedMtxApiSidecar4, requiredMtxSidecarApi4 // APIs
13
13
  } = require('../_merging/registry-mta')
14
14
 
15
15
  module.exports = class MultitenancyTemplate extends require('../templateBase') {
@@ -23,25 +23,25 @@ module.exports = class MultitenancyTemplate extends require('../templateBase') {
23
23
 
24
24
  async run() {
25
25
  const projectDescriptor = await readProject(this.options)
26
- const { isNodejs } = projectDescriptor.cap
27
- await mergeJSON('package.json', join(__dirname, 'files', `package.json.hbs`), projectDescriptor)
26
+ const { isNodejs, configFile } = projectDescriptor.cap
27
+ await mergeJSON(configFile, join(__dirname, 'files', `package.json.hbs`), projectDescriptor)
28
28
  if (isNodejs) await sortDependencies('package.json')
29
29
  await copyRenderedJSON(join(__dirname, 'files', 'package.sidecar.json.hbs'), join('mtx', 'sidecar', 'package.json'), projectDescriptor)
30
30
  await this.runDependentMerging()
31
31
  }
32
32
 
33
33
  async runDependentMerging(context = {}) {
34
- const projectDescriptor = await readProject()
34
+ const projectDescriptor = await readProject(this.options)
35
35
  const { isNodejs, isJava, hasMta, hasHelm, hasApprouter, hasXsuaa, hasHana, srvPath } = projectDescriptor.cap
36
36
 
37
37
  if (hasMta) {
38
- const srv = (isNodejs ? srvNode : srvJava)(srvPath)
38
+ const srv = (isNodejs ? srvNode4 : srvJava4)(srvPath)
39
39
  const mtxSidecar = mtxSidecar4(isJava ? 'mtx/sidecar' : 'gen/mtx/sidecar')
40
40
  const modules = [srv, mtxSidecar]
41
41
  const services = [saasRegistry]
42
42
  if (hasXsuaa) services.push(xsuaa)
43
- const apis = [srvAPI(srv), providedMtxAPISidecar4(mtxSidecar)]
44
- if (isJava) apis.push(requiredMtxSidecarAPI(srv))
43
+ const apis = [srvApi4(srv), providedMtxApiSidecar4(mtxSidecar)]
44
+ if (isJava) apis.push(requiredMtxSidecarApi4(srv))
45
45
  const additions = [...modules, ...services, ...apis]
46
46
 
47
47
  const overwrites = hasXsuaa ? [{ item: [xsuaa, 'parameters.config.tenant-mode'], withValue: 'shared' }] : []
@@ -83,18 +83,21 @@ module.exports = class MultitenancyTemplate extends require('../templateBase') {
83
83
  projectDescriptor
84
84
  )
85
85
 
86
+ const envFromObject = {
87
+ envFrom: [
88
+ {
89
+ configMapRef: {
90
+ name: "{{ .Release.Name }}-mtxs-configmap"
91
+ }
92
+ }
93
+ ]
94
+ }
95
+
86
96
  await mergeYAML(
87
97
  join('chart', 'values.yaml'),
88
98
  {
89
- srv: {
90
- envFrom: [
91
- {
92
- configMapRef: {
93
- name: "{{ .Release.Name }}-mtxs-configmap"
94
- }
95
- }
96
- ]
97
- },
99
+ ...(isNodejs) && { sidecar: envFromObject },
100
+ ...(isJava) && { srv: envFromObject },
98
101
  "saas-registry": {
99
102
  parametersFrom: [
100
103
  {
@@ -5,11 +5,19 @@
5
5
  "version": "0.2.0",
6
6
  "configurations": [
7
7
  {
8
- "command": "cds serve --with-mocks --in-memory?",
9
8
  "name": "cds serve",
10
9
  "request": "launch",
11
- "type": "node-terminal",
12
- "skipFiles": [ "<node_internals>/**" ]
10
+ "type": "node",
11
+ "cwd": "${workspaceFolder}",
12
+ "runtimeExecutable": "cds",
13
+ "args": [
14
+ "serve",
15
+ "--with-mocks",
16
+ "--in-memory?"
17
+ ],
18
+ "skipFiles": [
19
+ "<node_internals>/**"
20
+ ]
13
21
  }
14
22
  ]
15
23
  }
@@ -2,7 +2,7 @@ const { join, relative } = require('path');
2
2
  const cds = require('../../../cds')
3
3
  const { mkdirp } = cds.utils
4
4
  const { COMMAND_ADD, OPTION_JAVA, OPTION_NODEJS, URLS } = require('../../constants')
5
- const { copyFiles } = require('../../util/templateUtil')
5
+ const { copyFiles } = require('../../util/template')
6
6
  const LOG = console
7
7
 
8
8
  module.exports = class NodejsTemplate extends require('../templateBase') {
@@ -1,7 +1,7 @@
1
1
  const { join } = require('path');
2
2
  const cds = require('../../../cds')
3
3
  const { exists } = cds.utils
4
- const { copyFiles } = require('../../util/templateUtil')
4
+ const { copyFiles } = require('../../util/template')
5
5
  const { URLS } = require('../../constants')
6
6
  const LOG = console
7
7
 
@@ -0,0 +1,14 @@
1
+ ---
2
+ modules:
3
+ - name: {{cap.appName}}-srv
4
+ type: {{cap.language}}
5
+ path: {{& cap.srvPath}}
6
+ requires:
7
+ - name: {{cap.appName}}-redis
8
+
9
+ resources:
10
+ - name: {{cap.appName}}-redis
11
+ type: org.cloudfoundry.managed-service
12
+ parameters:
13
+ service: redis-cache
14
+ service-plan: default
@@ -0,0 +1,22 @@
1
+ {
2
+ {{#cap.isNodejs}}
3
+ "dependencies": {
4
+ "redis": "^4"
5
+ },
6
+ "cds": {
7
+ {{/cap.isNodejs}}
8
+ "requires": {
9
+ {{#cap.for}}
10
+ "[{{cap.for}}]": {
11
+ {{/cap.for}}
12
+ "messaging": {
13
+ "kind": "redis-messaging"
14
+ }
15
+ {{#cap.for}}
16
+ }
17
+ {{/cap.for}}
18
+ }
19
+ {{#cap.isNodejs}}
20
+ }
21
+ {{/cap.isNodejs}}
22
+ }
@@ -0,0 +1,50 @@
1
+ const { join } = require('path')
2
+ const cds = require('../../../cds')
3
+ const { read } = cds.utils
4
+ const { readProject } = require('../../util/projectReader')
5
+ const { mergeJSON, mergeYAML } = require('../../util/merge')
6
+ const { srvNode4, srvJava4, redis } = require('../_merging/registry-mta')
7
+
8
+ module.exports = class RedisMessagingTemplate extends require('../templateBase') {
9
+
10
+ async canRun() {
11
+ const projectDescriptor = await readProject(this.options)
12
+ const { hasMta, hasHelm, isJava } = projectDescriptor.cap
13
+ if (isJava) throw `'cds add redis-messaging' is not available for Java yet`
14
+ if (hasHelm && !hasMta) throw `'cds add redis-messaging' is not available for Kyma yet`
15
+ return true
16
+ }
17
+
18
+ static hasFacet(env) {
19
+ return env.requires?.messaging?.kind === 'redis-messaging'
20
+ }
21
+
22
+ async run() {
23
+ const projectDescriptor = await readProject(this.options)
24
+ const { configFile } = projectDescriptor.cap
25
+ projectDescriptor.cap.shortcut = !(await read(configFile)).cds?.requires?.messaging?.kind
26
+ await mergeJSON(configFile, join(__dirname, 'files', 'package.json.hbs'), projectDescriptor)
27
+ await this.runDependentMerging()
28
+ }
29
+
30
+ async runDependentMerging() {
31
+ const projectDescriptor = await readProject(this.options)
32
+ const { hasMta, isNodejs, srvPath } = projectDescriptor.cap
33
+
34
+ if (hasMta) {
35
+ const srv = (isNodejs ? srvNode4 : srvJava4)(srvPath)
36
+ await mergeYAML(
37
+ 'mta.yaml',
38
+ join(__dirname, 'files', 'mta.yaml.hbs'),
39
+ projectDescriptor,
40
+ {
41
+ additions: [srv, redis],
42
+ relationships: [{
43
+ insert: [redis, 'name'],
44
+ into: [srv, 'requires', 'name']
45
+ }]
46
+ }
47
+ )
48
+ }
49
+ }
50
+ }
@@ -1,8 +1,8 @@
1
1
  const { join } = require('path');
2
2
  const cds = require('../../../cds')
3
- const { copyFiles } = require('../../util/templateUtil')
4
- const commandUtil = require('../../util/commandUtil');
5
- const mvnArchetypes = require('../../util/mvnArchetypeUtil');
3
+ const { copyFiles } = require('../../util/template')
4
+ const commandUtil = require('../../../util/command');
5
+ const mvnArchetypes = require('../../util/mvn');
6
6
  const term = require('../../../util/term');
7
7
  const { PROJECT_TYPE, OPTION_JAVA, URLS } = require('../../constants');
8
8
 
@@ -3,17 +3,25 @@
3
3
  "devDependencies": {
4
4
  "sqlite3": "^5"
5
5
  },
6
- {{/cap.isNodejs}}
7
6
  "cds": {
7
+ {{/cap.isNodejs}}
8
8
  "requires": {
9
9
  {{#cap.for}}
10
10
  "[{{cap.for}}]": {
11
+ {{/cap.for}}
12
+ {{#cap.shortcut}}
11
13
  "db": "sqlite"
14
+ {{/cap.shortcut}}
15
+ {{^cap.shortcut}}
16
+ "db": {
17
+ "kind": "sqlite"
18
+ }
19
+ {{/cap.shortcut}}
20
+ {{#cap.for}}
12
21
  }
13
22
  {{/cap.for}}
14
- {{^cap.for}}
15
- "db": "sqlite"
16
- {{/cap.for}}
17
23
  }
24
+ {{#cap.isNodejs}}
18
25
  }
26
+ {{/cap.isNodejs}}
19
27
  }
@@ -1,4 +1,6 @@
1
1
  const { join } = require('path')
2
+ const cds = require('../../../cds')
3
+ const { read } = cds.utils
2
4
  const { readProject } = require('../../util/projectReader')
3
5
  const { mergeJSON } = require('../../util/merge')
4
6
 
@@ -6,6 +8,8 @@ module.exports = class SQLiteTemplate extends require('../templateBase') {
6
8
 
7
9
  async run() {
8
10
  const projectDescriptor = await readProject(this.options)
9
- await mergeJSON('package.json', join(__dirname, 'files', `package.json.hbs`), projectDescriptor)
11
+ const { configFile } = projectDescriptor.cap
12
+ projectDescriptor.cap.shortcut = !(await read(configFile)).cds?.requires?.db?.kind
13
+ await mergeJSON(configFile, join(__dirname, 'files', `package.json.hbs`), projectDescriptor)
10
14
  }
11
15
  }
@@ -0,0 +1,20 @@
1
+ {
2
+ {{#cap.isNodejs}}
3
+ "dependencies": {
4
+ "@sap/cds-mtxs": "^1"
5
+ },
6
+ "cds": {
7
+ {{/cap.isNodejs}}
8
+ "requires": {
9
+ {{#cap.for}}
10
+ "[{{cap.for}}]": {
11
+ {{/cap.for}}
12
+ "toggles": true
13
+ {{#cap.for}}
14
+ }
15
+ {{/cap.for}}
16
+ }
17
+ {{#cap.isNodejs}}
18
+ }
19
+ {{/cap.isNodejs}}
20
+ }
@@ -10,15 +10,9 @@ module.exports = class TogglesTemplate extends require('../templateBase') {
10
10
 
11
11
  async run() {
12
12
  const projectDescriptor = await readProject(this.options)
13
- const { for: forProfile, isNodejs, isJava } = projectDescriptor.cap
14
- if (isNodejs) {
15
- const cdsTemplateFile = forProfile ? 'cds.package.json.hbs' : 'cds.package.json'
16
- await mergeJSON('package.json', join(__dirname, 'files', cdsTemplateFile), projectDescriptor)
17
- await sortDependencies('package.json')
18
- } else if (isJava) {
19
- const cdsTemplateFile = join(__dirname, 'files', forProfile ? 'cdsrc.json.hbs' : 'cdsrc.json')
20
- await mergeJSON('.cdsrc.json', cdsTemplateFile, projectDescriptor)
21
- }
13
+ const { isNodejs , configFile} = projectDescriptor.cap
14
+ await mergeJSON(configFile, join(__dirname, 'files', 'package.json.hbs'), projectDescriptor)
15
+ if (isNodejs) await sortDependencies('package.json')
22
16
  await this.runDependentMerging()
23
17
  }
24
18
  }
@@ -0,0 +1,28 @@
1
+ {
2
+ {{#cap.isNodejs}}
3
+ "dependencies": {
4
+ "@sap/xssec": "^3",
5
+ "passport": "^0"
6
+ },
7
+ "cds": {
8
+ {{/cap.isNodejs}}
9
+ "requires": {
10
+ {{#cap.for}}
11
+ "[{{cap.for}}]": {
12
+ {{/cap.for}}
13
+ {{#cap.shortcut}}
14
+ "auth": "xsuaa"
15
+ {{/cap.shortcut}}
16
+ {{^cap.shortcut}}
17
+ "auth": {
18
+ "kind": "xsuaa"
19
+ }
20
+ {{/cap.shortcut}}
21
+ {{#cap.for}}
22
+ }
23
+ {{/cap.for}}
24
+ }
25
+ {{#cap.isNodejs}}
26
+ }
27
+ {{/cap.isNodejs}}
28
+ }
@@ -1,9 +1,10 @@
1
1
  const { join } = require('path')
2
+ const cds = require('../../../cds')
3
+ const { read } = cds.utils
2
4
  const { readProject } = require('../../util/projectReader')
3
5
  const { mergeJSON, mergeYAML } = require('../../util/merge')
4
- const { parseMd5File, writeMd5File } = require('../../util/md5Tracking')
5
- const { srvNode, srvJava, xsuaa, mtxSidecar4 } = require('../_merging/registry-mta')
6
- const { PROJECT_TYPE } = require('../../constants')
6
+ const { parseMd5File, writeMd5File } = require('../../util/md5')
7
+ const { srvNode4, srvJava4, xsuaa, mtxSidecar4 } = require('../_merging/registry-mta')
7
8
 
8
9
  module.exports = class XsuaaTemplate extends require('../templateBase') {
9
10
 
@@ -12,26 +13,10 @@ module.exports = class XsuaaTemplate extends require('../templateBase') {
12
13
  }
13
14
 
14
15
  async run() {
15
- const { projectPath } = this
16
- const templatePath = join(__dirname, 'files')
17
16
  const projectDescriptor = await readProject(this.options)
18
- const projectType = this.getProjectType();
19
- const { for: forProfile } = projectDescriptor.cap
20
-
21
- if (projectType === PROJECT_TYPE.java) {
22
- const cdsrcJSONPath = join(projectPath, '.cdsrc.json')
23
- const cdsTemplateFile = forProfile ? 'cds.cdsrc.json.hbs' : 'cds.cdsrc.json'
24
- const cdsTemplatePath = join(templatePath, cdsTemplateFile)
25
- await mergeJSON(cdsrcJSONPath, cdsTemplatePath, projectDescriptor)
26
- } else if (projectType === PROJECT_TYPE.nodejs) {
27
- const packageJSONPath = join(projectPath, 'package.json')
28
- const cdsTemplateFile = forProfile ? 'cds.package.json.hbs' : 'cds.package.json'
29
- const cdsTemplatePath = join(templatePath, cdsTemplateFile)
30
- await mergeJSON(packageJSONPath, cdsTemplatePath, projectDescriptor)
31
- const dependenciesTemplatePath = join(templatePath, 'dependencies.package.json')
32
- await mergeJSON(packageJSONPath, dependenciesTemplatePath)
33
- }
34
-
17
+ const { configFile } = projectDescriptor.cap
18
+ projectDescriptor.cap.shortcut = !(await read(configFile)).cds?.requires?.auth?.kind
19
+ await mergeJSON(configFile, join(__dirname, 'files', 'package.json.hbs'), projectDescriptor, { forceOverwrite: true })
35
20
  await this.runDependentMerging()
36
21
  }
37
22
 
@@ -55,7 +40,7 @@ module.exports = class XsuaaTemplate extends require('../templateBase') {
55
40
  await mergeJSON('xs-security.json', xsSecurity, projectDescriptor, mergingSemantics)
56
41
 
57
42
  if (hasMta) {
58
- const srv = (isJava ? srvJava : srvNode)(srvPath)
43
+ const srv = (isJava ? srvJava4 : srvNode4)(srvPath)
59
44
  const additions = [srv, xsuaa]
60
45
  const mtxSidecar = mtxSidecar4(isJava ? 'mtx/sidecar' : 'gen/mtx/sidecar')
61
46
  if (isMultitenant && isJava) additions.push(mtxSidecar)
@@ -4,7 +4,7 @@ const { dirname, join } = path
4
4
 
5
5
  const crypto = require('crypto');
6
6
  const os = require('os');
7
- const { copyRenderedYAML } = require('./fsUtil');
7
+ const { copyRenderedYAML } = require('../../util/fs');
8
8
 
9
9
  async function copyAndTrack(source, dest, context = {}, { force = false, projectDescriptor } = {}) {
10
10
  await mkdirp(dirname(dest));
@@ -1,6 +1,6 @@
1
1
  const YAML = require('@sap/cds-foss').yaml
2
2
  const { copy, read, write, exists } = require('../../cds').utils
3
- const { readYAML, writeYAML, readJSON } = require('./fsUtil')
3
+ const { readYAML, writeYAML, readJSON } = require('../../util/fs')
4
4
 
5
5
  function _isObject(item) {
6
6
  return item && typeof item === 'object' && !Array.isArray(item)
@@ -36,6 +36,7 @@ async function sortDependencies(packageJSONPath) {
36
36
  async function mergeJSON(into, from, projectDescriptor, semantics) {
37
37
  const source = typeof from === 'string' ? await readJSON(from, projectDescriptor) : from
38
38
 
39
+
39
40
  if (typeof into === 'string' && !exists(into)) {
40
41
  return write(into, source, { spaces: 2 })
41
42
  }
@@ -56,14 +57,8 @@ async function mergeJSON(into, from, projectDescriptor, semantics) {
56
57
  }
57
58
 
58
59
  async function mergeYAML(into, from, projectDescriptor, semantics = {}) {
59
- const target =
60
- typeof into === 'string' ? await readYAML(into) :
61
- into instanceof YAML.Document ? into :
62
- new YAML.Document(into)
63
- const source =
64
- typeof from === 'string' ? await readYAML(from, projectDescriptor)
65
- : from instanceof YAML.Document ? from :
66
- new YAML.Document(from)
60
+ const target = typeof into === 'string' ? await readYAML(into) : into instanceof YAML.Document ? into : new YAML.Document(into)
61
+ const source = typeof from === 'string' ? await readYAML(from, projectDescriptor) : from instanceof YAML.Document ? from : new YAML.Document(from)
67
62
 
68
63
  if (!target || !target.contents) {
69
64
  if (typeof into === 'string' && typeof from === 'string') {
@@ -44,6 +44,9 @@ class MvnArchetypeUtil {
44
44
  if (DEBUG) {
45
45
  params.set('-X'); params.set('-e');
46
46
  }
47
+ if (process.env.CI) {
48
+ params.set('--batch-mode');
49
+ }
47
50
 
48
51
  return Array.from(params, ([arg, val]) => val !== null && val !== undefined ? `${arg}=${val}` : arg)
49
52
  }
@@ -1,17 +1,9 @@
1
1
  const cds = require('../../cds')
2
2
  const { path, read, exists } = cds.utils
3
- const { BuildTaskFactory } = cds.build
3
+ const { parseXml } = require('./xml')
4
4
  const P_LANGUAGE_JAVA = 'java'
5
5
  const P_LANGUAGE_NODEJS = 'nodejs'
6
6
  const DEFAULT_P_LANGUAGE = P_LANGUAGE_NODEJS
7
- const BUILD_TASK_JAVA = "java"
8
- const BUILD_TASK_JAVA_CF = "java-cf"
9
- const BUILD_TASK_NODEJS = "nodejs"
10
- const BUILD_TASK_NODE_CF = "node-cf"
11
- const BUILD_TASK_HANA = "hana"
12
- const BUILD_TASK_FIORI = "fiori"
13
- const BUILD_TASK_MTX = "mtx"
14
- const BUILD_TASK_MTX_SIDECAR = "mtx-sidecar"
15
7
  const DEBUG = /\b(y|all|cli)\b/.test(process.env.DEBUG) && console.debug
16
8
  const LOG = console
17
9
 
@@ -29,6 +21,7 @@ module.exports = new class ProjectReader {
29
21
  const cdsEnvVar = process.env.CDS_ENV
30
22
  process.env.CDS_ENV = profile
31
23
  try {
24
+ // REVISIT: this is invoked 5 times for cds add multitenancy
32
25
  return cds.env.for('cds')
33
26
  } finally {
34
27
  cdsEnvVar ? process.env.CDS_ENV = cdsEnvVar : delete process.env.CDS_ENV
@@ -59,6 +52,7 @@ module.exports = new class ProjectReader {
59
52
  requires: [],
60
53
  get hasRequires() { return this.requires.length > 0 },
61
54
  get needsSidecar() { return (options?.add.has('hana') || this.db.length > 0) && (this.isJava || !this.isMultitenant) },
55
+ get configFile() { return exists('pom.xml') ? '.cdsrc.json' : 'package.json' },
62
56
  get isNodejs() { return this.language === P_LANGUAGE_NODEJS },
63
57
  get isJava() { return this.language === P_LANGUAGE_JAVA },
64
58
  get hasSidecar() { return exists('mtx', 'sidecar') },
@@ -68,7 +62,6 @@ module.exports = new class ProjectReader {
68
62
  get hasXsuaa() { return _hasFacet('xsuaa') },
69
63
  get hasAuditlog() { return _hasFacet('auditlog') },
70
64
  get hasApprouter() { return _hasFacet('approuter') },
71
- get hasMessaging() { return _hasFacet('enterprise-messaging') },
72
65
  get hasDestination() { return _hasFacet('destinations') },
73
66
  get hasHtml5Repo() { return _hasFacet('html5-repo') },
74
67
  get hasMta() { return _hasFacet('mta') },
@@ -80,49 +73,22 @@ module.exports = new class ProjectReader {
80
73
  cds.env // make sure env is initialized, otherwise we cannot set it (exotic case)
81
74
  cds.env = env
82
75
 
83
- const nullLogger = { debug: () => { }, log: () => { }, warn: () => { }, error: () => { }, write: () => { } }
84
-
85
- // no file path resolving as the directories might not exist - e.g. cds add will create the mtx/sidecar folder
86
- // REVISIT: Leaner API from cds.build
87
- const buildTasks = await new BuildTaskFactory(nullLogger, cds).getTasks({ root: cds.root, resolve: false, mta: false })
88
-
89
- await Promise.all(buildTasks.map(async (task) => {
90
- const srcPath = path.resolve(cds.root, task.src)
91
- const srcFolder = path.basename(srcPath)
92
- const relDestPath = path.join(env?.build?.target ?? "gen", task.dest || task.src)?.replace(/\\/g, '/')
93
-
94
-
95
- switch (task.for) {
96
- case BUILD_TASK_HANA:
97
- // check whether we have a hana service binding defined as a hana build task is returned by default for compatibility reasons if neither hana, nor sqlite has been defined
98
- if (this._hasHanaServiceBinding(env)) {
99
- cap.db.push({ path: relDestPath, name: srcFolder })
100
- }
101
- break
102
-
103
- case BUILD_TASK_JAVA:
104
- case BUILD_TASK_JAVA_CF:
105
- cap.language = P_LANGUAGE_JAVA
106
- cap.srvPath = relDestPath
107
- cap.srvName = srcFolder
108
- cap.srvExt = await this._getJavaExtDescriptor(srcPath)
109
- break
110
-
111
- case BUILD_TASK_NODEJS:
112
- case BUILD_TASK_NODE_CF:
113
- cap.srvPath = relDestPath
114
- cap.srvName = srcFolder
115
- break
76
+ // check whether we have a hana service binding defined as a hana build task is returned by default for compatibility reasons if neither hana, nor sqlite has been defined
77
+ if (this._hasHanaServiceBinding(env)) {
78
+ const dbFolder = env.folders.db.replace(/\/$/, '')
79
+ const relDbDestPath = path.join(env.build.target, dbFolder).replace(/\\/g, '/')
80
+ cap.db.push({ path: relDbDestPath, name: dbFolder })
81
+ }
116
82
 
117
- case BUILD_TASK_FIORI:
118
- case BUILD_TASK_MTX:
119
- case BUILD_TASK_MTX_SIDECAR:
120
- break
83
+ const srvFolder = env.folders.srv.replace(/\/$/, '')
84
+ const relSrvDestPath = path.join(env.build.target, srvFolder).replace(/\\/g, '/')
85
+ cap.srvPath = relSrvDestPath
86
+ cap.srvName = srvFolder
121
87
 
122
- default:
123
- LOG.warn(`Unknown build task type ${task.for}`)
124
- }
125
- }))
88
+ if (env['project-nature'] === 'java') {
89
+ cap.language = P_LANGUAGE_JAVA
90
+ cap.srvExt = await this._getJavaExtDescriptor(path.resolve(cds.root, srvFolder))
91
+ }
126
92
 
127
93
  // setting app name, app description...
128
94
  await this._setAppDetails(cap)
@@ -139,7 +105,7 @@ module.exports = new class ProjectReader {
139
105
  */
140
106
  async _getJavaExtDescriptor(srcPath) {
141
107
  // by default spring-boot:repackage is used creating an executable jar archive
142
- const pomJson = await this._parseXml(path.join(srcPath, 'pom.xml'))
108
+ const pomJson = await parseXml(path.join(srcPath, 'pom.xml'))
143
109
  if (pomJson) {
144
110
  const dependencies = pomJson?.project?.dependencies?.[0]?.dependency
145
111
  const isOldJavaRuntime = [...dependencies].some(d => /com\.sap\.cloud\.servicesdk/.test(d?.groupId?.[0]))
@@ -172,7 +138,7 @@ module.exports = new class ProjectReader {
172
138
  const pomXmlPath = path.join(cds.root, 'pom.xml')
173
139
  try {
174
140
  if (exists(pomXmlPath)) {
175
- const pomJson = await this._parseXml(pomXmlPath)
141
+ const pomJson = await parseXml(pomXmlPath)
176
142
  const [artifactId] = pomJson?.project?.artifactId ?? []
177
143
  const [description] = pomJson?.project?.description ?? []
178
144
  let [version] = pomJson?.project?.version ?? []
@@ -228,6 +194,12 @@ module.exports = new class ProjectReader {
228
194
  cap.appVersion = cap.appVersion ?? '1.0.0'
229
195
  }
230
196
 
197
+ _hasHanaServiceBinding(env) {
198
+ const db = env?.requires?.db
199
+ return db?.kind === 'hana' || db?.kind === 'sql' && (db?.dialect === 'hana' || db?.use === 'hana')
200
+ }
201
+
202
+ // REVISIT: Only used for orphaned cds add cf-manifest. Still needed?
231
203
  _setResourceDependencies(env, cap) {
232
204
  for (const [key, require] of Object.entries(env.requires)) {
233
205
  if (key === 'sql' || key === 'sqlite' || key === 'hana') continue // ignore abstract helper definitions like sql
@@ -236,11 +208,6 @@ module.exports = new class ProjectReader {
236
208
  }
237
209
  }
238
210
 
239
- _hasHanaServiceBinding(env) {
240
- const db = env?.requires?.db
241
- return db?.kind === 'hana' || db?.kind === 'sql' && (db?.dialect === 'hana' || db?.use === 'hana')
242
- }
243
-
244
211
  _getReqResource(key, reqEntry, cap) {
245
212
  const { kind, dialect, use, vcap = {}, multiTenant } = reqEntry
246
213
  const { appName, isMultitenant } = cap
@@ -282,53 +249,4 @@ module.exports = new class ProjectReader {
282
249
  }
283
250
  return resource.service ? resource : null
284
251
  }
285
-
286
- /**
287
- * Parse a given string containing xml
288
- * used to remove the _text object from converted json i.e. from xml-js.
289
- * example : converted json has "groupId":[{"_text":["customer"]}]
290
- * and after removing textAttributes (using this function): "groupId":["customer"]
291
- * @param xml string to parse
292
- * @returns parsed json object
293
- */
294
- async _parseXml(pomXmlPath) {
295
- const xmljs = require('xml-js');
296
- const xmljsParse = {};
297
- try {
298
- const xml = await read(pomXmlPath, 'utf-8')
299
- xmljsParse.project = JSON.parse(await xmljs.xml2json(xml, {
300
- ignoreComment: true,
301
- compact: true,
302
- alwaysArray: true,
303
- ignoreDeclaration: true,
304
- attributesKey: "$",
305
- trim: true,
306
- nativeType: true,
307
- ignoreInstruction: true,
308
- ignoreCdata: true,
309
- ignoreDoctype: true,
310
- textFn: this._removeTextAttributes
311
- })).project[0];
312
- return xmljsParse;
313
- } catch (e) {
314
- LOG.error(`Failed to read file ${pomXmlPath} - skip pom.xml data`)
315
- LOG.error(e)
316
- }
317
- }
318
-
319
- /*
320
- Remove the _text attributes and convert value it into array
321
- input : "groupId":[{"_text":["customer"]}]
322
- output: "groupId":["customer"]
323
- */
324
- _removeTextAttributes(value, parentElement) {
325
- const parentKeys = Object.keys(parentElement._parent);
326
- const key = parentKeys[parentKeys.length - 1];
327
- const _text = parentElement._parent[key];
328
- if (_text.length > 0) {
329
- _text[_text.length - 1] = value;
330
- } else {
331
- parentElement._parent[key] = value;
332
- }
333
- }
334
252
  }