@sap/cds-dk 6.0.4 → 6.1.3

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 (104) hide show
  1. package/CHANGELOG.md +60 -1
  2. package/bin/add.js +29 -16
  3. package/bin/compile/index.js +7 -2
  4. package/bin/fix-redirects.js +4 -2
  5. package/bin/init.js +5 -0
  6. package/bin/login.js +20 -4
  7. package/bin/pull.js +58 -0
  8. package/bin/push.js +52 -0
  9. package/bin/subscribe.js +45 -0
  10. package/lib/bind/bindingUtil.js +1 -2
  11. package/lib/cds.js +2 -3
  12. package/lib/client/activate.js +17 -16
  13. package/lib/client/auth_manager.js +10 -5
  14. package/lib/client/base_command.js +4 -6
  15. package/lib/client/extend.js +3 -2
  16. package/lib/client/helper/cf_helper.js +1 -0
  17. package/lib/client/helper/errors.js +11 -0
  18. package/lib/client/helper/logging.js +3 -10
  19. package/lib/client/helper/url_helper.js +7 -3
  20. package/lib/client/index.js +1 -1
  21. package/lib/client/params.js +9 -6
  22. package/lib/client/pull.js +48 -0
  23. package/lib/client/push.js +45 -0
  24. package/lib/client/settings_manager.js +81 -27
  25. package/lib/compile/openapi/csdl2openapi.js +135 -163
  26. package/lib/compile/openapi/index.js +0 -1
  27. package/lib/import/common.js +9 -1
  28. package/lib/import/odata/metadataconverter/MetadataConverter.js +17 -4
  29. package/lib/import/odata/v2parser.js +50 -26
  30. package/lib/import/odata/v4parser.js +110 -29
  31. package/lib/import/openapi/importOpenAPI.js +3 -3
  32. package/lib/init/constants.js +9 -3
  33. package/lib/init/template/_merging/registry-mta.js +284 -0
  34. package/lib/init/template/approuter/files/xs-app.json.hbs +7 -7
  35. package/lib/init/template/approuter/index.js +22 -32
  36. package/lib/init/template/auditlog/index.js +7 -9
  37. package/lib/init/template/data/index.js +2 -4
  38. package/lib/init/template/extensibility/files/cds.package.json +7 -0
  39. package/lib/init/template/extensibility/files/cds.package.json.hbs +9 -0
  40. package/lib/init/template/extensibility/files/xs-security.json.hbs +26 -0
  41. package/lib/init/template/extensibility/index.js +48 -0
  42. package/lib/init/template/hana/files/java/cdsrc.json.hbs +1 -1
  43. package/lib/init/template/hana/files/java/profile.cdsrc.json.hbs +2 -2
  44. package/lib/init/template/hana/files/mta.yaml.hbs +10 -0
  45. package/lib/init/template/hana/files/nodejs/cds.package.json.hbs +1 -1
  46. package/lib/init/template/hana/files/nodejs/cds.profile.package.json.hbs +2 -2
  47. package/lib/init/template/hana/index.js +74 -61
  48. package/lib/init/template/kibana-logging/index.js +31 -37
  49. package/lib/init/template/lint/files/.eslint/rules/no-entity-moo.js +14 -14
  50. package/lib/init/template/mta/files/mta.yaml.hbs +1 -1
  51. package/lib/init/template/mta/index.js +13 -7
  52. package/lib/init/template/mtx/index.js +2 -142
  53. package/lib/init/template/multitenancy/files/cds.package.json +7 -0
  54. package/lib/init/template/multitenancy/files/cds.package.json.hbs +9 -0
  55. package/lib/init/template/{mtx → multitenancy}/files/dependencies.package.json +1 -1
  56. package/lib/init/template/multitenancy/files/java/.cdsrc.json +19 -0
  57. package/lib/init/template/multitenancy/files/java/package.json +31 -0
  58. package/lib/init/template/{mtx → multitenancy}/files/mta.yaml.hbs +13 -6
  59. package/lib/init/template/multitenancy/files/xs-security.json.hbs +18 -0
  60. package/lib/init/template/multitenancy/index.js +109 -0
  61. package/lib/init/template/nodejs/files/package.json.hbs +4 -1
  62. package/lib/init/template/templateBase.js +2 -1
  63. package/lib/init/template/toggles/files/cds.package.json +7 -0
  64. package/lib/init/template/toggles/files/cds.package.json.hbs +9 -0
  65. package/lib/init/template/toggles/index.js +24 -0
  66. package/lib/init/template/xsuaa/files/mta.yaml.hbs +10 -0
  67. package/lib/init/template/xsuaa/index.js +44 -33
  68. package/lib/init/util/projectReader.js +12 -7
  69. package/lib/init/util/templateUtil.js +113 -111
  70. package/lib/k8s/ChartAdder.js +13 -3
  71. package/lib/k8s/ChartBuilder.js +6 -0
  72. package/lib/k8s/buildModel.js +1 -3
  73. package/lib/k8s/connectivity/index.js +5 -5
  74. package/lib/k8s/deployment/index.js +2 -4
  75. package/lib/k8s/deployment/subchart/Chart.yaml +1 -1
  76. package/lib/k8s/deployment/subchart/templates/_helpers.tpl +22 -11
  77. package/lib/k8s/deployment/subchart/templates/deployment.yaml +12 -5
  78. package/lib/k8s/deployment/subchart/templates/network-policy.yaml +3 -1
  79. package/lib/k8s/deployment/subchart/templates/pod-disruption-budget.yaml +1 -1
  80. package/lib/k8s/deployment/subchart/values.md +812 -0
  81. package/lib/k8s/deployment/subchart/values.schema.json +125 -30
  82. package/lib/k8s/deployment/subchart/values.yaml +7 -3
  83. package/lib/k8s/hana-deployer/index.js +10 -0
  84. package/lib/k8s/hana-deployer/templates/hana-deployer-job.yaml +8 -0
  85. package/lib/k8s/html5-apps-deployer/index.js +10 -0
  86. package/lib/k8s/html5-apps-deployer/templates/html5-apps-deployer-job.yaml +8 -0
  87. package/lib/k8s/index.js +2 -2
  88. package/lib/k8s/resources/helm/chart/schemas/values.root.schema.json +11 -0
  89. package/lib/k8s/resources/helm/chart/schemas/values.schema.json +479 -0
  90. package/lib/k8s/resources/helm/chart/templates/_deployment_helpers.tpl +1 -159
  91. package/lib/k8s/resources/helm/chart/templates/_helpers.tpl +0 -33
  92. package/lib/k8s/resources/helm/chart/templates/_sapcp_helpers.tpl +1 -1
  93. package/lib/lint/Linter.js +155 -158
  94. package/lib/lint/io.js +12 -5
  95. package/npm-shrinkwrap.json +214 -74
  96. package/package.json +5 -4
  97. package/lib/init/template/_merging/existences.js +0 -297
  98. package/lib/init/template/mtx/files/cds.package.json +0 -12
  99. package/lib/init/template/mtx/files/cds.package.json.hbs +0 -14
  100. package/lib/init/template/mtx/files/java/.cdsrc.json +0 -17
  101. package/lib/init/template/mtx/files/java/package.json +0 -43
  102. package/lib/init/template/mtx/files/java/server.js +0 -30
  103. package/lib/init/template/mtx/files/xs-security.json.hbs +0 -48
  104. package/lib/lint/.eslintrc.js +0 -3
@@ -1,4 +1,3 @@
1
- const fs = require('fs')
2
1
  const { join } = require('path')
3
2
  const TemplateBase = require('../templateBase')
4
3
  const ProjectReader = require('../../util/projectReader')
@@ -9,7 +8,7 @@ const {
9
8
  requiredMtxAPI, requiredJavaApprouterAPI, providedJavaApprouterAPI, // APIs
10
9
  requiredAppAPI, providedAppAPI,
11
10
  approuterExtensibility, approuterExtensibilityJava // xs-app.json config
12
- } = require('../_merging/existences')
11
+ } = require('../_merging/registry-mta')
13
12
 
14
13
  module.exports = class ApprouterTemplate extends TemplateBase {
15
14
 
@@ -24,50 +23,41 @@ module.exports = class ApprouterTemplate extends TemplateBase {
24
23
 
25
24
  async runDependentMerging() {
26
25
  const projectDescriptor = await this.projectReader.read(this.options)
27
- const mtaYAMLPath = join(this.projectPath, 'mta.yaml')
28
- const { isNodejs, isJava, isMultitenant } = projectDescriptor.cap
29
- if (fs.existsSync(mtaYAMLPath)) {
26
+ const { isNodejs, isJava, isExtensible, isMultitenant, hasMtaDeployment } = projectDescriptor.cap
27
+
28
+ if (hasMtaDeployment) {
30
29
  const srv = isNodejs ? srvNode : srvJava
31
30
  const apis = isJava ? [requiredJavaApprouterAPI, providedJavaApprouterAPI] : []
32
31
  if (isNodejs && isMultitenant) apis.push(requiredMtxAPI, requiredAppAPI, providedAppAPI)
33
32
  if (isJava && isMultitenant) apis.push(requiredMtxAPI)
34
- const existences = [srv, approuter, xsuaa, ...apis]
35
- await this.templateUtil.mergeYAML(
36
- mtaYAMLPath,
37
- `${__dirname}/files/mta.yaml.hbs`,
38
- projectDescriptor,
39
- {
40
- existences,
41
- relationships: [{
42
- in: srv,
43
- inKeyPath: ["requires"],
44
- into: "name",
45
- existences: [xsuaa],
46
- existenceKeyPath: ["name"],
47
- }, {
48
- in: approuter,
49
- inKeyPath: ["requires"],
50
- into: "name",
51
- existences: [xsuaa],
52
- existenceKeyPath: ["name"],
53
- }],
54
- }
55
- )
33
+ const additions = [srv, approuter, xsuaa, ...apis]
34
+ const mtaYAMLPath = join(this.projectPath, 'mta.yaml')
35
+ await this.templateUtil.mergeYAML(mtaYAMLPath, `${__dirname}/files/mta.yaml.hbs`, projectDescriptor, {
36
+ additions,
37
+ relationships: [{
38
+ insert: [xsuaa, 'name'],
39
+ into: [srv, 'requires', 'name']
40
+ }, {
41
+ insert: [xsuaa, 'name'],
42
+ into: [approuter, 'requires', 'name']
43
+ }],
44
+ })
56
45
  }
57
46
 
58
47
  const appPath = join(this.projectPath, projectDescriptor.ui.appPath || 'app')
59
- const existences = isMultitenant && isJava ? [approuterExtensibilityJava] :
60
- isMultitenant && isNodejs ? [approuterExtensibility] : []
48
+ const additions = isExtensible && isJava ? [{ ...approuterExtensibilityJava, at: 0 }] :
49
+ isExtensible && isNodejs ? [{ ...approuterExtensibility, at: 0 }] : []
61
50
  await this.templateUtil.mergeJSON(
62
51
  `${appPath}/xs-app.json`,
63
52
  `${__dirname}/files/xs-app.json.hbs`,
64
53
  projectDescriptor,
65
- { existences }
54
+ { additions }
66
55
  )
67
56
  }
68
57
 
69
58
  async run() {
70
59
  const projectDescriptor = await this.projectReader.read(this.options)
60
+ const { for: forProfile } = projectDescriptor.cap
71
61
  const appPath = join(this.projectPath, projectDescriptor.ui.appPath || 'app')
72
62
  const appPackageJSONPath = join(appPath, 'package.json')
73
63
 
@@ -83,14 +73,14 @@ module.exports = class ApprouterTemplate extends TemplateBase {
83
73
  switch (projectType) {
84
74
  case PROJECT_TYPE.java: {
85
75
  const cdsrcJSONPath = join(this.projectPath, '.cdsrc.json')
86
- const cdsTemplateFile = projectDescriptor.cap.for ? 'cds.cdsrc.json.hbs' : 'cds.cdsrc.json'
76
+ const cdsTemplateFile = forProfile ? 'cds.cdsrc.json.hbs' : 'cds.cdsrc.json'
87
77
  const cdsPackageJSONPath = join(__dirname, 'files', cdsTemplateFile)
88
78
  await this.templateUtil.mergeJSON(cdsrcJSONPath, cdsPackageJSONPath, projectDescriptor)
89
79
  break
90
80
  }
91
81
  case PROJECT_TYPE.nodejs: {
92
82
  const packageJSONPath = join(this.projectPath, 'package.json')
93
- const cdsTemplateFile = projectDescriptor.cap.for ? 'cds.package.json.hbs' : 'cds.package.json'
83
+ const cdsTemplateFile = forProfile ? 'cds.package.json.hbs' : 'cds.package.json'
94
84
  const cdsPackageJSONPath = join(__dirname, 'files', cdsTemplateFile)
95
85
  await this.templateUtil.mergeJSON(packageJSONPath, cdsPackageJSONPath, projectDescriptor)
96
86
  break
@@ -2,7 +2,7 @@ const fs = require('fs');
2
2
  const path = require('path');
3
3
  const TemplateBase = require('../templateBase');
4
4
  const ProjectReader = require('../../util/projectReader');
5
- const { srvNode, srvJava, auditlog } = require('../_merging/existences');
5
+ const { srvNode, srvJava, auditlog } = require('../_merging/registry-mta');
6
6
 
7
7
  module.exports = class AuditlogTemplate extends TemplateBase {
8
8
  constructor(projectPath, generator) {
@@ -12,22 +12,20 @@ module.exports = class AuditlogTemplate extends TemplateBase {
12
12
 
13
13
  async runDependentMerging() {
14
14
  const projectDescriptor = await this.projectReader.read(this.options);
15
+ const { isNodejs } = projectDescriptor.cap;
15
16
  const mtaYAMLPath = path.join(this.projectPath, 'mta.yaml');
16
17
  if (!fs.existsSync(mtaYAMLPath)) return;
17
- const srv = projectDescriptor.cap.isNodejs ? srvNode : srvJava
18
+ const srv = isNodejs ? srvNode : srvJava
18
19
  await this.templateUtil.mergeYAML(
19
20
  mtaYAMLPath,
20
21
  `${__dirname}/files/mta.yaml.hbs`,
21
22
  projectDescriptor,
22
23
  {
23
- existences: [srv, auditlog],
24
+ additions: [srv, auditlog],
24
25
  relationships: [{
25
- in: srv,
26
- inKeyPath: ["requires"],
27
- into: "name",
28
- existences: [auditlog],
29
- existenceKeyPath: ["name"],
30
- }],
26
+ insert: [auditlog, 'name'],
27
+ into: [srv, 'requires', 'name']
28
+ }]
31
29
  }
32
30
  );
33
31
  }
@@ -148,9 +148,8 @@ function getNamespace(csn, artifactName) {
148
148
 
149
149
  // First step is not a namespace (we faked those in the CSN)
150
150
  // No subsequent step can be a namespace then
151
- if (art && art.kind !== 'namespace') {
151
+ if (art && art.kind !== 'namespace' && art.kind !== 'context')
152
152
  return null;
153
- }
154
153
 
155
154
 
156
155
  for (let i = 1; i < parts.length; i++) {
@@ -159,9 +158,8 @@ function getNamespace(csn, artifactName) {
159
158
  seen = `${seen}.${parts[i]}`;
160
159
  // This might not be - if it isn't, return the result.
161
160
  const currentArtifact = csn.definitions[seen];
162
- if (currentArtifact && currentArtifact.kind !== 'namespace') {
161
+ if (currentArtifact && currentArtifact.kind !== 'namespace' && currentArtifact.kind !== 'context')
163
162
  return previousArtifactName;
164
- }
165
163
  }
166
164
  // We came till here - so the full artifactName is a namespace
167
165
  return artifactName;
@@ -0,0 +1,7 @@
1
+ {
2
+ "cds": {
3
+ "requires": {
4
+ "extensibility": true
5
+ }
6
+ }
7
+ }
@@ -0,0 +1,9 @@
1
+ {
2
+ "cds": {
3
+ "requires": {
4
+ "[{{cap.for}}]": {
5
+ "extensibility": true
6
+ }
7
+ }
8
+ }
9
+ }
@@ -0,0 +1,26 @@
1
+ {
2
+ "scopes": [
3
+ {
4
+ "name": "$XSAPPNAME.cds.ExtensionDeveloper",
5
+ "description": "Extend CAP applications via extension projects"
6
+ },
7
+ {
8
+ "name": "$XSAPPNAME.cds.UIFlexDeveloper",
9
+ "description": "Extend CAP applications via UIFlex extensibility"
10
+ }
11
+ ],
12
+ "role-templates": [
13
+ {
14
+ "name": "ExtensionDeveloper",
15
+ "description": "Extension development including UIFlex extensibility",
16
+ "scope-references": [
17
+ "$XSAPPNAME.cds.ExtensionDeveloper",
18
+ "$XSAPPNAME.cds.UIFlexDeveloper"
19
+ ]
20
+ }
21
+ ],
22
+ "authorities": [
23
+ "$XSAPPNAME.cds.ExtensionDeveloper",
24
+ "$XSAPPNAME.cds.UIFlexDeveloper"
25
+ ]
26
+ }
@@ -0,0 +1,48 @@
1
+ const cds = require('../../../cds'), { path } = cds.utils
2
+ const TemplateBase = require('../templateBase')
3
+ const ProjectReader = require('../../util/projectReader')
4
+
5
+ module.exports = class ExtensibilityTemplate extends TemplateBase {
6
+ constructor(projectPath, generator) {
7
+ super(projectPath, generator, __dirname)
8
+ this.projectReader = new ProjectReader(this)
9
+ }
10
+
11
+ async runDependentMerging() {
12
+ const projectDescriptor = await this.projectReader.read()
13
+ const { hasXsuaa } = projectDescriptor.cap
14
+ if (hasXsuaa) {
15
+ await this.templateUtil.mergeJSON(
16
+ path.join(this.projectPath, 'xs-security.json'),
17
+ path.join(__dirname, 'files', 'xs-security.json.hbs'),
18
+ projectDescriptor,
19
+ {
20
+ additions: [{
21
+ ref: 'scope-extension-developer',
22
+ in: 'scopes',
23
+ where: [{ property: 'name', isEqualTo: '$XSAPPNAME.cds.ExtensionDeveloper' }],
24
+ }, {
25
+ ref: 'scope-uiflex',
26
+ in: 'scopes',
27
+ where: [{ property: 'name', isEqualTo: '$XSAPPNAME.cds.UIFlexDeveloper' }],
28
+ }, {
29
+ ref: 'template-extension-developer',
30
+ in: 'role-templates',
31
+ where: [{ property: 'name', isEqualTo: 'ExtensionDeveloper' }],
32
+ }]
33
+ }
34
+ )
35
+ }
36
+ }
37
+
38
+ async run() {
39
+ const projectDescriptor = await this.projectReader.read(this.options)
40
+ const { for: forProfile, isJava } = projectDescriptor.cap
41
+ const basePath = isJava ? path.join(this.projectPath, 'mtx', 'sidecar') : this.projectPath
42
+ const packageJSONPath = path.join(basePath, 'package.json')
43
+ const cdsTemplateFile = forProfile ? 'cds.package.json.hbs' : 'cds.package.json'
44
+ await this.templateUtil.mergeJSON(packageJSONPath, path.join(__dirname, 'files', cdsTemplateFile), projectDescriptor)
45
+ await this.templateUtil.sortDependencies(packageJSONPath)
46
+ await this.runDependentMerging()
47
+ }
48
+ }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "requires": {
3
3
  "db": {
4
- "kind": { "#overwrite": "{{#cap.isMultitenant}}hana-mt{{/cap.isMultitenant}}{{^cap.isMultitenant}}hana-cloud{{/cap.isMultitenant}}" }
4
+ "kind": "{{#cap.isMultitenant}}hana-mt{{/cap.isMultitenant}}{{^cap.isMultitenant}}hana-cloud{{/cap.isMultitenant}}"
5
5
  }
6
6
  }
7
7
  }
@@ -2,11 +2,11 @@
2
2
  "requires": {
3
3
  "[{{cap.for}}]": {
4
4
  "db": {
5
- "kind": { "#overwrite": "{{#cap.isMultitenant}}hana-mt{{/cap.isMultitenant}}{{^cap.isMultitenant}}hana-cloud{{/cap.isMultitenant}}" }
5
+ "kind": "{{#cap.isMultitenant}}hana-mt{{/cap.isMultitenant}}{{^cap.isMultitenant}}hana-cloud{{/cap.isMultitenant}}"
6
6
  }
7
7
  },
8
8
  "db": {
9
- "kind": "sql"
9
+ "kind": "{{#cap.isMultitenant}}sqlite{{/cap.isMultitenant}}{{^cap.isMultitenant}}sql{{/cap.isMultitenant}}"
10
10
  }
11
11
  }
12
12
  }
@@ -15,6 +15,16 @@ modules:
15
15
  - name: {{cap.appName}}-db
16
16
  {{/cap.isMultitenant}}
17
17
 
18
+ {{#cap.isJava}}
19
+ {{#cap.isMultitenant}}
20
+ - name: {{cap.appName}}-mtx-sidecar
21
+ type: nodejs
22
+ path: mtx/sidecar
23
+ requires:
24
+ - name: {{cap.appName}}-db
25
+ {{/cap.isMultitenant}}
26
+ {{/cap.isJava}}
27
+
18
28
  resources:
19
29
  - name: {{cap.appName}}-db
20
30
  {{^cap.isMultitenant}}
@@ -2,7 +2,7 @@
2
2
  "cds": {
3
3
  "requires": {
4
4
  "db": {
5
- "kind": { "#overwrite": "{{#cap.isMultitenant}}hana-mt{{/cap.isMultitenant}}{{^cap.isMultitenant}}hana-cloud{{/cap.isMultitenant}}" }
5
+ "kind": "{{#cap.isMultitenant}}sql-mt{{/cap.isMultitenant}}{{^cap.isMultitenant}}hana-cloud{{/cap.isMultitenant}}"
6
6
  }
7
7
  }
8
8
  }
@@ -3,11 +3,11 @@
3
3
  "requires": {
4
4
  "[{{cap.for}}]": {
5
5
  "db": {
6
- "kind": { "#overwrite": "{{#cap.isMultitenant}}hana-mt{{/cap.isMultitenant}}{{^cap.isMultitenant}}hana-cloud{{/cap.isMultitenant}}" }
6
+ "kind": "{{#cap.isMultitenant}}hana-mt{{/cap.isMultitenant}}{{^cap.isMultitenant}}hana-cloud{{/cap.isMultitenant}}"
7
7
  }
8
8
  },
9
9
  "db": {
10
- "kind": "sql"
10
+ "kind": "{{#cap.isMultitenant}}sqlite{{/cap.isMultitenant}}{{^cap.isMultitenant}}sql{{/cap.isMultitenant}}"
11
11
  }
12
12
  }
13
13
  }
@@ -11,7 +11,7 @@ const versionCompare = require('../../util/versionCompare');
11
11
 
12
12
  const { PROJECT_TYPE, OPTION_JAVA, URLS, OPTION_HELM_UPDATE } = require('../../constants');
13
13
  const { nullLogger } = require('../../util/logger');
14
- const { srvNode, srvJava, hdbDeployer, serviceManager, hdiContainer } = require('../_merging/existences');
14
+ const { srvNode, srvJava, hdbDeployer, serviceManager, hdiContainer, mtxSidecar } = require('../_merging/registry-mta');
15
15
 
16
16
  module.exports = class HanaTemplate extends TemplateBase {
17
17
  constructor(projectPath, generator) {
@@ -43,57 +43,62 @@ module.exports = class HanaTemplate extends TemplateBase {
43
43
  }
44
44
 
45
45
  async runDependentMerging() {
46
- const projectDescriptor = await this.projectReader.read(this.options);
46
+ const projectDescriptor = await this.projectReader.read(this.options)
47
+ const { hasMtaDeployment, isNodejs, isJava, isMultitenant, hasHana } = projectDescriptor.cap
48
+
49
+ if (isNodejs && isMultitenant) {
50
+ await this._updateCdsConfiguration()
51
+ } else if (isJava && isMultitenant) {
52
+ await this._updateCdsrcJson()
53
+ }
47
54
 
48
- const mtaYAMLPath = path.join(this.projectPath, 'mta.yaml');
55
+ if (hasMtaDeployment) {
56
+ const srv = isNodejs ? srvNode : srvJava
57
+ const db = isMultitenant ? serviceManager : hdiContainer
58
+ const deletions = isMultitenant ? [{
59
+ item: hdbDeployer,
60
+ relationships: [{
61
+ removeProperty: 'name',
62
+ allWithin: ['modules', 'requires', 'name'],
63
+ }]
64
+ }, {
65
+ item: hdiContainer,
66
+ relationships: [{
67
+ removeProperty: 'name',
68
+ allWithin: ['modules', 'requires', 'name'],
69
+ }]
70
+ }] : []
49
71
 
50
- if (!fs.existsSync(mtaYAMLPath)) return
72
+ const mtaYAMLPath = path.join(this.projectPath, 'mta.yaml')
51
73
 
52
- const srv = projectDescriptor.cap.isNodejs ? srvNode : srvJava
53
- const deployer = projectDescriptor.cap.isMultitenant ? null : hdbDeployer
54
- const db = projectDescriptor.cap.isMultitenant ? serviceManager : hdiContainer
55
- const deletions = projectDescriptor.cap.isMultitenant ? [{
56
- existence: hdbDeployer,
57
- relationships: [{
58
- allWithinKeyPath: ["modules"],
59
- inKeyPath: ["requires"],
60
- into: "name",
61
- existenceKeyPath: ["name"],
62
- }]
63
- }, {
64
- existence: hdiContainer,
65
- relationships: [{
66
- allWithinKeyPath: ["modules"],
67
- inKeyPath: ["requires"],
68
- into: "name",
69
- existenceKeyPath: ["name"],
74
+ const relationships = [{
75
+ insert: [db, 'name'],
76
+ into: [srv, 'requires', 'name']
70
77
  }]
71
- }] : []
72
-
73
- await this.templateUtil.mergeYAML(
74
- mtaYAMLPath,
75
- `${__dirname}/files/mta.yaml.hbs`,
76
- projectDescriptor,
77
- {
78
- existences: [srv, deployer, db],
79
- relationships: [{
80
- in: srv,
81
- inKeyPath: ["requires"],
82
- into: "name",
83
- existences: [db],
84
- existenceKeyPath: ["name"],
85
- },
86
- !projectDescriptor.cap.isMultitenant && projectDescriptor.cap.isNodejs ?
87
- {
88
- in: deployer,
89
- inKeyPath: ["requires"],
90
- into: "name",
91
- existences: [db],
92
- existenceKeyPath: ["name"],
93
- } : null],
94
- deletions
78
+
79
+ if (!isMultitenant) {
80
+ relationships.push({
81
+ insert: [hdiContainer, 'name'],
82
+ into: [hdbDeployer, 'requires', 'name']
83
+ })
84
+ }
85
+
86
+ if (isJava && isMultitenant) {
87
+ relationships.push({
88
+ insert: [serviceManager, 'name'],
89
+ into: [mtxSidecar, 'requires', 'name']
90
+ })
95
91
  }
96
- );
92
+
93
+ const modules = !isMultitenant ? [srv, hdbDeployer] : [srv]
94
+
95
+ await this.templateUtil.mergeYAML(
96
+ mtaYAMLPath,
97
+ `${__dirname}/files/mta.yaml.hbs`,
98
+ projectDescriptor,
99
+ { additions: [...modules, db].filter(a => a), deletions, relationships }
100
+ )
101
+ }
97
102
  }
98
103
 
99
104
  async run() {
@@ -112,14 +117,13 @@ module.exports = class HanaTemplate extends TemplateBase {
112
117
  case PROJECT_TYPE.java: {
113
118
  await this.templateUtil.copyFiles(path.join('java', 'db'), path.join(this.projectPath, env.folders.db), {}, this.options.force);
114
119
  await this._updatePomXml();
115
- const cdsrcJsonPath = path.join(this.projectPath, '.cdsrc.json');
116
- await this._updateCdsrcJson(cdsrcJsonPath, env.folders.db, env);
120
+ await this._updateCdsrcJson();
117
121
  break;
118
122
  }
119
- case PROJECT_TYPE.nodejs:
120
- await this._updatePackageJson(path.join(this.projectPath, 'package.json'));
123
+ case PROJECT_TYPE.nodejs: {
124
+ await this._updatePackageJson()
121
125
  break;
122
-
126
+ }
123
127
  default: break;
124
128
  }
125
129
  await this.runDependentMerging()
@@ -142,29 +146,38 @@ module.exports = class HanaTemplate extends TemplateBase {
142
146
  }
143
147
  }
144
148
 
145
- async _updatePackageJson(packageJsonPath) {
146
- const projectDescriptor = await this.projectReader.read(this.options);
149
+ async _updatePackageJson() {
150
+ const packageJsonPath = path.join(this.projectPath, 'package.json')
147
151
  const dependenciesTemplatePath = path.join(__dirname, 'files', 'nodejs', 'dependencies.package.json');
148
152
  await this.templateUtil.mergeJSON(packageJsonPath, dependenciesTemplatePath);
149
153
 
150
- const cdsTemplateFile = projectDescriptor.cap.for ? 'cds.profile.package.json.hbs' : 'cds.package.json.hbs';
151
- const cdsTemplatePath = path.join(__dirname, 'files', 'nodejs', cdsTemplateFile);
152
- await this.templateUtil.mergeJSON(packageJsonPath, cdsTemplatePath, projectDescriptor);
153
-
154
154
  const packageJson = await this.fsUtil.readJSON(packageJsonPath);
155
155
  if (packageJson.dependencies['@sap/hana-client']) {
156
156
  delete packageJson.dependencies['@sap/hana-client'];
157
157
  await this.fsUtil.writeJSON(packageJsonPath, packageJson);
158
158
  }
159
+
160
+ await this._updateCdsConfiguration(packageJsonPath)
161
+ }
162
+
163
+ async _updateCdsConfiguration() {
164
+ const packageJsonPath = path.join(this.projectPath, 'package.json')
165
+ const projectDescriptor = await this.projectReader.read(this.options);
166
+ const { for: forProfile } = projectDescriptor.cap;
167
+ const cdsTemplateFile = forProfile ? 'cds.profile.package.json.hbs' : 'cds.package.json.hbs';
168
+ const cdsTemplatePath = path.join(__dirname, 'files', 'nodejs', cdsTemplateFile);
169
+ await this.templateUtil.mergeJSON(packageJsonPath, cdsTemplatePath, projectDescriptor, { forceOverwrite: true })
159
170
  }
160
171
 
161
- async _updateCdsrcJson(cdsrcJsonPath) {
172
+ async _updateCdsrcJson() {
173
+ const cdsrcJsonPath = path.join(this.projectPath, '.cdsrc.json');
162
174
  const projectDescriptor = await this.projectReader.read(this.options);
163
- const cdsTemplateFile = projectDescriptor.cap.for ? 'profile.cdsrc.json.hbs' : 'cdsrc.json.hbs';
175
+ const { for: forProfile } = projectDescriptor.cap;
176
+ const cdsTemplateFile = forProfile ? 'profile.cdsrc.json.hbs' : 'cdsrc.json.hbs';
164
177
  const cdsTemplatePath = path.join(__dirname, 'files', 'java', cdsTemplateFile);
165
178
  if (!fs.existsSync(cdsrcJsonPath)) {
166
179
  this.fsUtil.writeJSON(cdsrcJsonPath, {})
167
180
  }
168
- await this.templateUtil.mergeJSON(cdsrcJsonPath, cdsTemplatePath, projectDescriptor);
181
+ await this.templateUtil.mergeJSON(cdsrcJsonPath, cdsTemplatePath, projectDescriptor, { forceOverwrite: true });
169
182
  }
170
183
  }
@@ -1,59 +1,53 @@
1
1
  const cds = require('../../../cds')
2
- const fs = require('fs');
3
- const path = require('path');
2
+ const path = require('path')
4
3
 
5
- const ProjectReader = require('../../util/projectReader');
6
-
7
- const TemplateBase = require('../templateBase');
8
-
9
- const { PROJECT_TYPE, } = require('../../constants');
10
- const { srvNode, srvJava, kibanaLogging } = require('../_merging/existences');
4
+ const ProjectReader = require('../../util/projectReader')
5
+ const TemplateBase = require('../templateBase')
6
+ const { PROJECT_TYPE, } = require('../../constants')
7
+ const { srvNode, srvJava, kibanaLogging } = require('../_merging/registry-mta')
11
8
 
12
9
  module.exports = class KibanaTemplate extends TemplateBase {
13
10
  constructor(projectPath, generator) {
14
- super(projectPath, generator, __dirname);
15
- this.projectReader = new ProjectReader(this);
11
+ super(projectPath, generator, __dirname)
12
+ this.projectReader = new ProjectReader(this)
16
13
  }
17
14
 
18
15
  async runDependentMerging() {
19
- const mtaYAMLPath = path.join(this.projectPath, 'mta.yaml');
20
-
21
- if (!fs.existsSync(mtaYAMLPath)) {
22
- return;
16
+ const projectDescriptor = await this.projectReader.read(this.options)
17
+ const { hasMtaDeployment, isNodejs } = projectDescriptor.cap
18
+
19
+ if (hasMtaDeployment) {
20
+ const srv = isNodejs ? srvNode : srvJava
21
+
22
+ const mtaYAMLPath = path.join(this.projectPath, 'mta.yaml')
23
+ await this.templateUtil.mergeYAML(
24
+ mtaYAMLPath,
25
+ `${__dirname}/files/mta.yaml.hbs`,
26
+ projectDescriptor,
27
+ {
28
+ additions: [srv, kibanaLogging],
29
+ relationships: [{
30
+ insert: [kibanaLogging, 'name'],
31
+ into: [srv, 'requires', 'name']
32
+ }],
33
+ }
34
+ )
23
35
  }
24
-
25
- const projectDescriptor = await this.projectReader.read(this.options);
26
- const srv = projectDescriptor.cap.isNodejs ? srvNode : srvJava
27
-
28
- await this.templateUtil.mergeYAML(
29
- mtaYAMLPath,
30
- `${__dirname}/files/mta.yaml.hbs`,
31
- projectDescriptor,
32
- {
33
- existences: [srv, kibanaLogging],
34
- relationships: [{
35
- in: srv,
36
- inKeyPath: ["requires"],
37
- into: "name",
38
- existences: [kibanaLogging],
39
- existenceKeyPath: ["name"],
40
- }],
41
- }
42
- );
43
36
  }
44
37
 
45
38
  async run() {
46
- const projectType = await this.getProjectType();
39
+ const projectType = await this.getProjectType()
47
40
 
48
41
  switch (projectType) {
49
42
  case PROJECT_TYPE.java:
50
43
  default:
51
- cds.error(`kibana-logging is not implemented for project type '${projectType}' yet`);
44
+ cds.error(`kibana-logging is not implemented for project type '${projectType}' yet`)
52
45
  // TODO: implement
53
- break;
46
+ break
54
47
  case PROJECT_TYPE.nodejs: {
55
48
  const projectDescriptor = await this.projectReader.read(this.options);
56
- const cdsTemplateFile = projectDescriptor.cap.for ? 'cds.profile.package.json.hbs' : 'cds.package.json'
49
+ const { for: forProfile } = projectDescriptor.cap
50
+ const cdsTemplateFile = forProfile ? 'cds.profile.package.json.hbs' : 'cds.package.json'
57
51
  const cdsTemplatePath = path.join(__dirname, 'files', cdsTemplateFile)
58
52
  await this.templateUtil.mergeJSON(path.join(this.projectPath, 'package.json'), cdsTemplatePath, projectDescriptor)
59
53
  }
@@ -1,4 +1,4 @@
1
- module.exports = require("@sap/eslint-plugin-cds/lib/api").createRule({
1
+ module.exports = require("@sap/eslint-plugin-cds").createRule({
2
2
  meta: {
3
3
  docs: {
4
4
  description: `Demonstrates how to implement a model validation check.
@@ -11,30 +11,30 @@ module.exports = require("@sap/eslint-plugin-cds/lib/api").createRule({
11
11
  (__)\ )\/\
12
12
  ||----w |
13
13
  || ||`,
14
- version: "1.0.0",
14
+ version: "1.0.0"
15
15
  },
16
- fixable: "code",
16
+ fixable: "code"
17
17
  },
18
18
  create: function (context) {
19
- const m = context.cds.model;
20
- m.forall("entity", (d) => {
21
- const entityName = d.name.split(".").pop();
19
+ return { entity: checkForMoo };
20
+
21
+ function checkForMoo(e) {
22
+ const entityName = e.name.split(".").pop();
22
23
  if (entityName === "Moo") {
23
- const loc = context.cds.getLocation(entityName, d);
24
+ const loc = context.getLocation(entityName, e);
24
25
  const fix = (fixer) => {
25
- const rangeEnd = context.sourcecode.getIndexFromLoc({
26
+ const rangeEnd = context.getSourceCode().getIndexFromLoc({
26
27
  line: loc.end.line,
27
- column: loc.end.column,
28
+ column: loc.end.column
28
29
  });
29
30
  return fixer.insertTextAfterRange([0, rangeEnd], "n");
30
31
  };
31
32
  context.report({
32
33
  message: "Entity 'Moo' not allowed!",
33
- loc,
34
- fix,
35
- file: d.$location.file,
34
+ node: context.getNode(e),
35
+ fix
36
36
  });
37
37
  }
38
- });
39
- },
38
+ }
39
+ }
40
40
  })