@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.
- package/CHANGELOG.md +21 -0
- package/bin/deploy/index.js +1 -1
- package/bin/import.js +5 -3
- package/bin/login.js +29 -9
- package/bin/watch.js +16 -0
- package/lib/bind/bindingUtil.js +2 -2
- package/lib/bind/userCdsrcJsonStorageProvider.js +1 -1
- package/lib/client/auth_manager.js +3 -1
- package/lib/client/helper/errors.js +6 -1
- package/lib/client/params.js +22 -20
- package/lib/client/settings_manager.js +17 -3
- package/lib/compile/openapi/csdl2openapi.js +2 -1
- package/lib/import/asyncapi/importAsyncAPI.js +32 -0
- package/lib/import/asyncapi/index.js +15 -0
- package/lib/import/asyncapi/parserContext.js +351 -0
- package/lib/import/asyncapi/utils.js +18 -0
- package/lib/import/common.js +21 -67
- package/lib/import/importapi.js +23 -2
- package/lib/import/message.js +11 -1
- package/lib/import/odata/index.js +14 -11
- package/lib/import/odata/metadataconverter/MetadataConverter.js +35 -35
- package/lib/import/odata/util/MultiMap.js +5 -5
- package/lib/import/odata/v2parser.js +1 -0
- package/lib/import/odata/v4parser.js +1281 -1139
- package/lib/init/constants.js +10 -3
- package/lib/init/template/_merging/registry-mta.js +33 -36
- package/lib/init/template/approuter/files/mtxs-configmap-java.yaml +20 -0
- package/lib/init/template/approuter/files/mtxs-configmap-nodejs.yaml +12 -0
- package/lib/init/template/approuter/index.js +24 -33
- package/lib/init/template/auditlog/files/package.json.hbs +27 -0
- package/lib/init/template/auditlog/index.js +12 -6
- package/lib/init/template/cf-manifest/index.js +1 -1
- package/lib/init/template/connectivity/index.js +1 -1
- package/lib/init/template/destinations/index.js +4 -2
- package/lib/init/template/enterprise-messaging/files/package.json.hbs +19 -0
- package/lib/init/template/enterprise-messaging/index.js +15 -13
- package/lib/init/template/enterprise-messaging-shared/files/event-mesh.json.hbs +31 -0
- package/lib/init/template/enterprise-messaging-shared/files/mta.yaml.hbs +15 -0
- package/lib/init/template/enterprise-messaging-shared/files/package.json.hbs +22 -0
- package/lib/init/template/enterprise-messaging-shared/files/values.yaml +7 -0
- package/lib/init/template/enterprise-messaging-shared/index.js +51 -0
- package/lib/init/template/extensibility/files/package.json.hbs +20 -0
- package/lib/init/template/extensibility/index.js +4 -16
- package/lib/init/template/file-based-messaging/files/package.json.hbs +19 -0
- package/lib/init/template/file-based-messaging/index.js +25 -0
- package/lib/init/template/hana/files/package.json.hbs +33 -0
- package/lib/init/template/hana/index.js +38 -65
- package/lib/init/template/helm/chart/templates/_deployment_helpers.tpl +0 -12
- package/lib/init/template/helm/chart/templates/_helpers.tpl +1 -121
- package/lib/init/template/helm/index.js +1 -1
- package/lib/init/template/html5-repo/index.js +1 -1
- package/lib/init/template/java/index.js +2 -2
- package/lib/init/template/kibana-logging/files/package.json.hbs +17 -0
- package/lib/init/template/kibana-logging/index.js +6 -19
- package/lib/init/template/lint/index.js +1 -1
- package/lib/init/template/mta/index.js +2 -2
- package/lib/init/template/multitenancy/files/mtxs-configmap-java.yaml +3 -5
- package/lib/init/template/multitenancy/files/mtxs-configmap-nodejs.yaml +3 -10
- package/lib/init/template/multitenancy/files/package.json.hbs +5 -4
- package/lib/init/template/multitenancy/index.js +22 -19
- package/lib/init/template/nodejs/files/.vscode/launch.json +11 -3
- package/lib/init/template/nodejs/index.js +1 -1
- package/lib/init/template/pipeline/index.js +1 -1
- package/lib/init/template/redis-messaging/files/mta.yaml.hbs +14 -0
- package/lib/init/template/redis-messaging/files/package.json.hbs +22 -0
- package/lib/init/template/redis-messaging/index.js +50 -0
- package/lib/init/template/samples/index.js +3 -3
- package/lib/init/template/sqlite/files/package.json.hbs +12 -4
- package/lib/init/template/sqlite/index.js +5 -1
- package/lib/init/template/toggles/files/package.json.hbs +20 -0
- package/lib/init/template/toggles/index.js +3 -9
- package/lib/init/template/xsuaa/files/package.json.hbs +28 -0
- package/lib/init/template/xsuaa/index.js +8 -23
- package/lib/init/util/{md5Tracking.js → md5.js} +1 -1
- package/lib/init/util/merge.js +4 -9
- package/lib/init/util/{mvnArchetypeUtil.js → mvn.js} +3 -0
- package/lib/init/util/projectReader.js +25 -107
- package/lib/init/util/xml.js +56 -0
- package/lib/lint/checks.js +1 -1
- package/lib/lint/io.js +1 -1
- package/lib/{init/util/commandUtil.js → util/command.js} +4 -2
- package/lib/{init/util/fsUtil.js → util/fs.js} +2 -2
- package/npm-shrinkwrap.json +17 -16
- package/package.json +5 -4
- package/lib/init/template/approuter/files/cds.cdsrc.json +0 -7
- package/lib/init/template/approuter/files/cds.cdsrc.json.hbs +0 -9
- package/lib/init/template/approuter/files/cds.package.json +0 -9
- package/lib/init/template/approuter/files/cds.package.json.hbs +0 -11
- package/lib/init/template/auditlog/files/dependencies.package.json +0 -5
- package/lib/init/template/enterprise-messaging/files/cds.package.json +0 -9
- package/lib/init/template/enterprise-messaging/files/cds.profile.package.json.hbs +0 -11
- package/lib/init/template/enterprise-messaging/files/cdsrc.json +0 -7
- package/lib/init/template/enterprise-messaging/files/cdsrc.json.hbs +0 -9
- package/lib/init/template/extensibility/files/cds.package.json +0 -7
- package/lib/init/template/extensibility/files/cds.package.json.hbs +0 -9
- package/lib/init/template/extensibility/files/cdsrc.json +0 -5
- package/lib/init/template/extensibility/files/cdsrc.json.hbs +0 -7
- package/lib/init/template/hana/files/java/cds.json.hbs +0 -7
- package/lib/init/template/hana/files/java/cds.profile.json.hbs +0 -12
- package/lib/init/template/hana/files/java/cds.shortcut.json.hbs +0 -5
- package/lib/init/template/hana/files/java/cds.shortcut.profile.json.hbs +0 -8
- package/lib/init/template/hana/files/nodejs/cds.json.hbs +0 -9
- package/lib/init/template/hana/files/nodejs/cds.profile.json.hbs +0 -14
- package/lib/init/template/hana/files/nodejs/cds.shortcut.json.hbs +0 -7
- package/lib/init/template/hana/files/nodejs/cds.shortcut.profile.json.hbs +0 -10
- package/lib/init/template/hana/files/nodejs/dependencies.package.json +0 -5
- package/lib/init/template/helm/chart/templates/_sapcp_helpers.tpl +0 -103
- package/lib/init/template/kibana-logging/files/cds.profile.package.json.hbs +0 -9
- package/lib/init/template/toggles/files/cds.package.json +0 -7
- package/lib/init/template/toggles/files/cds.package.json.hbs +0 -9
- package/lib/init/template/toggles/files/cdsrc.json +0 -5
- package/lib/init/template/toggles/files/cdsrc.json.hbs +0 -7
- package/lib/init/template/xsuaa/files/cds.cdsrc.json +0 -7
- package/lib/init/template/xsuaa/files/cds.cdsrc.json.hbs +0 -9
- package/lib/init/template/xsuaa/files/cds.package.json +0 -9
- package/lib/init/template/xsuaa/files/cds.package.json.hbs +0 -11
- package/lib/init/template/xsuaa/files/dependencies.package.json +0 -6
- package/lib/init/util/versionCompare.js +0 -73
- /package/lib/init/template/hana/files/{java/db → db}/package.json +0 -0
- /package/lib/init/template/hana/files/{common/src → src}/.hdiconfig +0 -0
- /package/lib/init/template/hana/files/{common/undeploy.json → undeploy.json} +0 -0
- /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/
|
|
7
|
-
const { copyRenderedJSON } = require('
|
|
6
|
+
const { copyAndTrack, parseMd5File, writeMd5File } = require('../../util/md5')
|
|
7
|
+
const { copyRenderedJSON } = require('../../../util/fs')
|
|
8
8
|
const {
|
|
9
|
-
|
|
9
|
+
srvNode4, srvJava4, // Server
|
|
10
10
|
mtxSidecar4, // Additional Modules
|
|
11
11
|
saasRegistry, serviceManager, xsuaa, // BTP Services
|
|
12
|
-
|
|
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(
|
|
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 ?
|
|
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 = [
|
|
44
|
-
if (isJava) apis.push(
|
|
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
|
-
|
|
90
|
-
|
|
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
|
|
12
|
-
"
|
|
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/
|
|
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/
|
|
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/
|
|
4
|
-
const commandUtil = require('
|
|
5
|
-
const mvnArchetypes = require('../../util/
|
|
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
|
-
|
|
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 {
|
|
14
|
-
|
|
15
|
-
|
|
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/
|
|
5
|
-
const {
|
|
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
|
|
19
|
-
|
|
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 ?
|
|
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('
|
|
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));
|
package/lib/init/util/merge.js
CHANGED
|
@@ -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('
|
|
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
|
-
|
|
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') {
|
|
@@ -1,17 +1,9 @@
|
|
|
1
1
|
const cds = require('../../cds')
|
|
2
2
|
const { path, read, exists } = cds.utils
|
|
3
|
-
const {
|
|
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
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
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
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
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
|
-
|
|
123
|
-
|
|
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
|
|
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
|
|
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
|
}
|