@sap/cds-dk 7.7.2 → 7.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 (50) hide show
  1. package/bin/add.js +42 -17
  2. package/bin/bind.js +21 -12
  3. package/bin/build.js +14 -2
  4. package/bin/deploy/to-sqlite.js +1 -1
  5. package/bin/help.js +4 -1
  6. package/bin/version.js +54 -22
  7. package/lib/bind/userCdsrcJsonStorageProvider.js +1 -1
  8. package/lib/build/buildTaskFactory.js +2 -2
  9. package/lib/build/provider/hana/index.js +1 -1
  10. package/lib/build/provider/internalBuildTaskProvider.js +19 -5
  11. package/lib/build/provider/mtx/resourcesTarBuilder.js +16 -4
  12. package/lib/build/provider/mtx-extension/extensionCompilation.js +13 -2
  13. package/lib/build/provider/mtx-extension/index.js +6 -2
  14. package/lib/build/provider/nodejs/index.js +4 -4
  15. package/lib/build/util.js +1 -12
  16. package/lib/compile/openapi/index.js +2 -1
  17. package/lib/index.js +2 -2
  18. package/lib/init/constants.js +2 -1
  19. package/lib/init/index.js +9 -23
  20. package/lib/init/plugin.js +8 -0
  21. package/lib/init/registries/mta.js +6 -0
  22. package/lib/init/template/data/as-csv.js +60 -0
  23. package/lib/init/template/data/as-json.js +441 -0
  24. package/lib/init/template/data/index.js +115 -86
  25. package/lib/init/template/helm/files/content-deployment/Chart.yaml +1 -1
  26. package/lib/init/template/helm/files/content-deployment/templates/job.yaml +7 -0
  27. package/lib/init/template/helm/files/content-deployment/values.schema.json +17 -0
  28. package/lib/init/template/helm/files/content-deployment/values.yaml +6 -1
  29. package/lib/init/template/helm/files/service-instance/Chart.yaml +1 -1
  30. package/lib/init/template/helm/files/service-instance/templates/serviceinstance.yaml +4 -0
  31. package/lib/init/template/helm/files/service-instance/values.schema.json +17 -1
  32. package/lib/init/template/helm/files/service-instance/values.yaml +4 -1
  33. package/lib/init/template/helm/files/values.yaml.hbs +2 -2
  34. package/lib/init/template/helm/files/web-application/Chart.yaml +1 -1
  35. package/lib/init/template/helm/files/web-application/templates/api-rule.yaml +4 -0
  36. package/lib/init/template/helm/files/web-application/templates/network-policy.yaml +15 -0
  37. package/lib/init/template/helm/files/web-application/values.schema.json +41 -0
  38. package/lib/init/template/helm/files/web-application/values.yaml +19 -1
  39. package/lib/init/template/helm-unified-runtime/files/values.yaml.hbs +2 -2
  40. package/lib/init/template/helm-unified-runtime/index.js +9 -6
  41. package/lib/init/template/http/index.js +182 -0
  42. package/lib/init/template/kafka/files/mta.yaml.hbs +14 -0
  43. package/lib/init/template/kafka/files/package.json.hbs +22 -0
  44. package/lib/init/template/kafka/index.js +40 -0
  45. package/lib/init/template/lint/index.js +4 -4
  46. package/lib/init/template/mta/files/mta.yaml.hbs +4 -0
  47. package/lib/init/template/multitenancy/files/values.yaml.hbs +2 -2
  48. package/lib/util/cf.js +6 -2
  49. package/npm-shrinkwrap.json +13 -13
  50. package/package.json +1 -1
@@ -1,57 +1,90 @@
1
-
2
1
  const cds = require('../../../cds')
3
2
  const { exists, fs } = cds.utils
4
- const { resolve, join, relative } = require('path');
5
- const DEBUG = cds.debug('cli')
3
+ const { resolve, join, relative } = require('path')
4
+ const { URLSearchParams } = require('url')
6
5
  const { env4 } = require('../../projectReader')
6
+ const asJson = require('./as-json')
7
+ const asCsv = require('./as-csv')
7
8
 
8
9
  module.exports = class DataTemplate extends require('../../plugin') {
9
10
 
11
+ options() {
12
+ return {
13
+ 'filter': {
14
+ type: 'string',
15
+ short: 'f',
16
+ help: `Filter for entities matching the given pattern. If it contains meta
17
+ characters like '^' or '*', it is treated like a regular expression,
18
+ otherwise as a prefix.`
19
+ },
20
+ 'data:for': {
21
+ type: 'string',
22
+ help: `Deprecated. Use '--filter' instead.`
23
+ },
24
+ 'records': {
25
+ type: 'number',
26
+ short: 'n',
27
+ help: 'The number of records to be created for each entity.'
28
+ },
29
+ 'content-type': {
30
+ type: 'string',
31
+ short: 'c',
32
+ help: 'The content type of the data. One of "json" or "csv".'
33
+ },
34
+ 'out': {
35
+ type: 'string',
36
+ short: 'o',
37
+ help: 'The output target folder.'
38
+ }
39
+ }
40
+ }
41
+
10
42
  async run() {
11
43
  if (cds.cli.options.for) {
12
44
  throw `\nError: Did you mean \`... --data:for\` ?`
13
45
  }
14
46
 
15
- const env = env4('production')
16
-
17
- let dest = (typeof cds.cli.options.out === 'string') // target folder
18
- ? cds.cli.options.out
19
- : getDefaultTargetFolder(env);
20
- dest = resolve(cds.root, dest);
47
+ let { force, out,
48
+ 'content-type' : contentType='csv',
49
+ records=1
50
+ } = cds.cli.options
51
+ if (typeof records === 'string') records = parseInt(records)
52
+ if (Number.isNaN(records) || records < 1) records = 1
21
53
 
22
- const nameFilter = asRegex(cds.cli.options['data:for'])
23
- const { force } = cds.cli.options
54
+ const [filterName, filterQueryStr] = (cds.cli.options['filter'] ?? cds.cli.options['data:for'] ?? '').split(':')
55
+ const nameFilter = asRegex(filterName)
56
+ const dataForParams = parseQueryStr(filterQueryStr)
24
57
 
25
- let csn = await cds.compile.to.csn(cds.env.roots) // normal CSN
58
+ const env = env4('production')
59
+ let dest = (typeof out === 'string') // target folder
60
+ ? out
61
+ : getDefaultTargetFolder(env)
62
+ dest = resolve(cds.root, dest)
26
63
 
64
+ let csn = await cds.load(cds.env.roots) // normal CSN
27
65
  // Skip of unused reuse entities like Language, Country, Currency
28
66
  csn = cds.minify(csn)
67
+ csn = cds.reflect(csn) // reflected model (adds additional helper functions)
29
68
 
30
- // Also include 'external' entities w/ cds.persistence.skip (similar to 'mocked' option of serve).
31
- // Could be too much sometimes, but don't want to bother users w/ a separate option for this.
32
- includeExternalEntities(csn)
69
+ const data = csn.all('entity')
70
+ .filter (e => e.name.match(nameFilter)) // --for prefix|regex
71
+ .reduce((all, e) => { all[e.name] = []; return all }, {})
33
72
 
34
- csn = cds.compile.for.sql(csn, { names:env.sql.names, messages:[] }) // CSN w/ persistence information
35
- csn = cds.reflect(csn); // reflected model (adds additional helper functions)
73
+ await asJson(data, csn, records)
36
74
 
37
- csn.all('entity')
38
- .filter (e => e.name.match(nameFilter)) // --for prefix|regex
39
- .filter (e => !e.query) // exclude entities with queries (projection on, select from ...)
40
- .filter (e => e.name !== 'DRAFT.DraftAdministrativeData' && !e.name.endsWith('.drafts')) // exclude draft stuff
41
- .forEach(e => processEntity(e, dest, csn, force));
42
- }
43
- }
75
+ if (contentType === 'csv') {
76
+ const headerOnly = !cds.cli.options['records'] // compat to old behavior which only creates headers
77
+ await asCsv(data, csn, Object.assign({ headerOnly }, dataForParams))
78
+ }
44
79
 
45
- function includeExternalEntities(model) {
46
- for (let each in model.definitions) {
47
- const def = model.definitions[each]
48
- if (def['@cds.persistence.skip'] === true) {
49
- DEBUG?.('Including skipped entity '+each)
50
- delete def['@cds.persistence.skip']
80
+ // write files
81
+ for (const name of Object.keys(data)) {
82
+ writeFileFor(csn.definitions[name], data[name], csn, dest, force)
51
83
  }
52
84
  }
53
- return model
54
85
  }
86
+ module.exports.asJson = asJson
87
+ module.exports.asCsv = asCsv
55
88
 
56
89
  function asRegex(spec) {
57
90
  if (typeof spec === 'string') {
@@ -69,96 +102,92 @@ function asRegex(spec) {
69
102
  return /.*/
70
103
  }
71
104
 
72
- function processEntity (entity, dest, csn, force) {
73
- let dataFileName;
74
- const namespace = getNamespace(csn, entity.name);
105
+ function parseQueryStr(queryStr) {
106
+ const params = new URLSearchParams(queryStr) // e.g. key1&key2=false
107
+ const res = Object.fromEntries(params)
108
+ for (let [k, v] of Object.entries(res)) {
109
+ if (v.length === 0 || v === 'true') res[k] = true
110
+ else if (v === 'false') res[k] = false
111
+ }
112
+ return res
113
+ }
114
+
115
+ function writeFileFor (entity, data, csn, dest, force) {
116
+ let dataFileName
117
+ const namespace = getNamespace(csn, entity.name)
75
118
  if (!namespace || namespace == entity.name) {
76
- dataFileName = `${entity.name}.csv`;
119
+ dataFileName = `${entity.name}`
77
120
  }
78
121
  else {
79
- const entityName = entity.name.replace(namespace + '.', '');
80
- dataFileName = `${namespace}-${entityName}.csv`;
122
+ const entityName = entity.name.replace(namespace + '.', '')
123
+ dataFileName = `${namespace}-${entityName}`
81
124
  }
125
+ dataFileName += Array.isArray(data) ? '.json' : '.csv'
82
126
 
127
+ let dataFilePath = join(dest, dataFileName)
128
+ let fileExists = exists(join(dest, dataFileName))
83
129
  if (entity.name.endsWith('.texts')) {
84
130
  // handle '.texts' entities (for localized elements) differently:
85
131
  // if there is already file exist with '_texts' (old cds versions) - overwrite this one (when --force is used)
86
132
  // otherwise use the new '.texts' format
87
- const dataFileNameOldFormat = dataFileName.replace('.texts.csv','_texts.csv');
88
- const dataFilePathOldFormat = join(dest, dataFileNameOldFormat);
133
+ const dataFileNameOldFormat = dataFileName.replace('.texts.csv','_texts.csv')
134
+ const dataFilePathOldFormat = join(dest, dataFileNameOldFormat)
89
135
  if (exists(dataFilePathOldFormat)) {
90
- createDataFile(true, dataFilePathOldFormat, dest, force, entity);
91
- return;
136
+ dataFileName = dataFileNameOldFormat
137
+ dataFilePath = join(dest, dataFileName)
138
+ fileExists = true
92
139
  }
93
140
  }
94
141
 
95
- const dataFilePath = join(dest, dataFileName);
96
- createDataFile(exists(dataFilePath), dataFilePath, dest, force, entity);
97
- }
98
-
99
- function getDefaultTargetFolder (env) {
100
- const { db } = env.folders
101
- // csv files should be located in the 'db/data' folder unless a 'db/csv' folder already exists
102
- return join(db, exists(join(db, 'csv')) ? 'csv' : 'data')
103
- }
104
-
105
-
106
- function createDataFile (isFileExists, dataFilePath, dest, force, entity) {
107
- let relFilePath = dataFilePath;
142
+ let relFilePath = dataFilePath
108
143
  if (dataFilePath.indexOf(cds.root) === 0) {
109
144
  // use relative path in log (for readability), only when data files are added within the project
110
145
  // (potentially can be located anywhere using the --out parameter)
111
- relFilePath = relative(cds.root, dataFilePath);
146
+ relFilePath = relative(cds.root, dataFilePath)
112
147
  }
113
- if (isFileExists && !force) {
114
- console.log(`Skipping ${relFilePath}`);
148
+
149
+ // continue only if file not already exists, or '--force' option provided
150
+ if (fileExists && !force) {
151
+ console.log(`Skipping ${relFilePath}`)
152
+ return
115
153
  }
116
- else {
117
- // continue only if file not already exists, or '--force' option provided
118
- const dataFileContent = prepareDataFileContent(entity);
119
- if (dataFileContent && dataFileContent.length) {
120
- if (!exists(dest)) fs.mkdirSync(dest, {recursive: true})
121
- fs.writeFileSync(dataFilePath, dataFileContent);
122
- isFileExists ? console.log(`Overwriting `+relFilePath) : console.log(`Creating `+relFilePath)
123
- }
154
+
155
+ if (typeof data === 'object')
156
+ data = JSON.stringify(data, null, 2)
157
+ if (data.length) {
158
+ if (!exists(dest)) fs.mkdirSync(dest, {recursive: true})
159
+ fs.writeFileSync(dataFilePath, data)
160
+ fileExists ? console.log(`Overwriting `+relFilePath) : console.log(`Creating `+relFilePath)
124
161
  }
125
162
  }
126
163
 
127
- function prepareDataFileContent (entity) {
128
- const persistenceKeyNames = Object.keys(entity.keys||[])
129
- return Object.entries(entity.elements)
130
- .filter(([,element]) => !(element instanceof cds.Association)) // exclude associations+compositions
131
- .filter(([,element]) => !!element['@cds.persistence.name']) // exclude no-persistence elements, e.g. virtual ones
132
- .map (([key]) => key)
133
- .sort((k1, k2) => { // sort with keys first
134
- if (persistenceKeyNames.includes(k1) && !persistenceKeyNames.includes(k2)) return -1
135
- if (!persistenceKeyNames.includes(k1) && persistenceKeyNames.includes(k2)) return 1
136
- return 0 // preserve original order otherwise
137
- })
138
- .join(',') // using comma as csv separator by default
164
+ function getDefaultTargetFolder (env) {
165
+ const { db } = env.folders
166
+ // csv files should be located in the 'db/data' folder unless a 'db/csv' folder already exists
167
+ return join(db, exists(join(db, 'csv')) ? 'csv' : 'data')
139
168
  }
140
169
 
141
170
  // Logic is taken from cds-compile
142
171
  function getNamespace(csn, artifactName) {
143
- const parts = artifactName.split('.');
144
- let seen = parts[0];
145
- const art = csn.definitions[seen];
172
+ const parts = artifactName.split('.')
173
+ let seen = parts[0]
174
+ const art = csn.definitions[seen]
146
175
 
147
176
  // First step is not a namespace (we faked those in the CSN)
148
177
  // No subsequent step can be a namespace then
149
178
  if (art && art.kind !== 'namespace' && art.kind !== 'context')
150
- return null;
179
+ return null
151
180
 
152
181
 
153
182
  for (let i = 1; i < parts.length; i++) {
154
183
  // This was definitely a namespace so far
155
- const previousArtifactName = seen;
156
- seen = `${seen}.${parts[i]}`;
184
+ const previousArtifactName = seen
185
+ seen = `${seen}.${parts[i]}`
157
186
  // This might not be - if it isn't, return the result.
158
- const currentArtifact = csn.definitions[seen];
187
+ const currentArtifact = csn.definitions[seen]
159
188
  if (currentArtifact && currentArtifact.kind !== 'namespace' && currentArtifact.kind !== 'context')
160
- return previousArtifactName;
189
+ return previousArtifactName
161
190
  }
162
191
  // We came till here - so the full artifactName is a namespace
163
- return artifactName;
192
+ return artifactName
164
193
  }
@@ -4,4 +4,4 @@ name: content-deployment
4
4
  sources:
5
5
  - https://github.tools.sap/unified-runtime/content-deployment
6
6
  type: application
7
- version: 1.5.0
7
+ version: 1.6.0
@@ -3,6 +3,10 @@ apiVersion: batch/v1
3
3
  kind: Job
4
4
  metadata:
5
5
  labels: {{- include "content-deployment.internal.labels" . | nindent 4 }}
6
+ {{- if or .Values.annotations.job }}
7
+ annotations:
8
+ {{- tpl (toYaml .Values.annotations.job) $ | nindent 4 }}
9
+ {{- end }}
6
10
  name: {{ include "content-deployment.internal.jobName" . }}
7
11
  spec:
8
12
  completions: 1
@@ -14,6 +18,9 @@ spec:
14
18
  labels: {{- include "content-deployment.internal.labels" . | nindent 8 }}
15
19
  annotations:
16
20
  container.apparmor.security.beta.kubernetes.io/{{ include "content-deployment.internal.name" . }}: runtime/default
21
+ {{- if or .Values.annotations.job }}
22
+ {{- tpl (toYaml .Values.annotations.job) $ | nindent 8 }}
23
+ {{- end }}
17
24
  spec:
18
25
  {{- if (include "content-deployment.internal.imagePullSecretName" .) }}
19
26
  imagePullSecrets:
@@ -495,6 +495,23 @@
495
495
  ]
496
496
  }
497
497
  }
498
+ },
499
+ "annotations": {
500
+ "$id": "#/properties/annotations",
501
+ "title": "Additional annotations",
502
+ "type": "object",
503
+ "additionalProperties": false,
504
+ "properties": {
505
+ "job": {
506
+ "type": "object",
507
+ "title": "Annotations to add to the Job",
508
+ "patternProperties": {
509
+ ".*": {
510
+ "type": "string"
511
+ }
512
+ }
513
+ }
514
+ }
498
515
  }
499
516
  },
500
517
  "definitions": {
@@ -15,7 +15,7 @@ global:
15
15
  _internal:
16
16
  content-deployment:
17
17
  versions:
18
- 1.5.0: true
18
+ 1.6.0: true
19
19
  # Will be used instead of the `.Chart.Name`, e.g. when generating the Deployment name.
20
20
  # nameOverride: name
21
21
 
@@ -93,3 +93,8 @@ ttlDaysAfterFinished: 14
93
93
  # serviceInstanceName: hana-manual
94
94
  # portal:
95
95
  # fromSecret: manual-secret # user-provided-service
96
+
97
+ ## Annotations to add to objects
98
+ annotations:
99
+ ## Annotations to add to the Job and underlying Pods
100
+ job: {}
@@ -4,4 +4,4 @@ name: service-instance
4
4
  sources:
5
5
  - https://github.tools.sap/unified-runtime/service-instance
6
6
  type: application
7
- version: 1.2.0
7
+ version: 1.3.0
@@ -3,6 +3,10 @@ apiVersion: services.cloud.sap.com/v1
3
3
  kind: ServiceInstance
4
4
  metadata:
5
5
  labels: {{- include "service-instance.internal.labels" . | nindent 4 }}
6
+ {{- if or .Values.annotations.serviceInstance }}
7
+ annotations:
8
+ {{- tpl (toYaml .Values.annotations.serviceInstance) $ | nindent 4 }}
9
+ {{- end }}
6
10
  name: {{ include "service-instance.internal.fullname" . }}
7
11
  spec:
8
12
  serviceOfferingName: {{ .Values.serviceOfferingName }}
@@ -80,6 +80,22 @@
80
80
  }
81
81
  }
82
82
  }
83
+ },
84
+ "annotations": {
85
+ "$id": "#/properties/annotations",
86
+ "title": "Additional annotations",
87
+ "type": "object",
88
+ "additionalProperties": false,
89
+ "properties": {
90
+ "serviceInstance": {
91
+ "type": "object",
92
+ "patternProperties": {
93
+ ".*": {
94
+ "type": "string"
95
+ }
96
+ }
97
+ }
98
+ }
83
99
  }
84
100
  }
85
- }
101
+ }
@@ -35,9 +35,12 @@
35
35
  # - configMapKeyRef:
36
36
  # name: my-cm
37
37
  # key: cm-parameter
38
+
39
+ annotations:
40
+ serviceInstance: {}
38
41
  global:
39
42
  sap:
40
43
  _internal:
41
44
  service-instance:
42
45
  versions:
43
- 1.2.0: true
46
+ 1.3.0: true
@@ -21,6 +21,6 @@ srv:
21
21
  memory: {{#isJava}}1G{{/isJava}}{{^isJava}}500M{{/isJava}}
22
22
  health:
23
23
  liveness:
24
- path: /
24
+ path: {{#isJava}}/{{/isJava}}{{^isJava}}/health{{/isJava}}
25
25
  readiness:
26
- path: /
26
+ path: {{#isJava}}/{{/isJava}}{{^isJava}}/health{{/isJava}}
@@ -5,4 +5,4 @@ name: web-application
5
5
  sources:
6
6
  - https://github.tools.sap/unified-runtime/web-application
7
7
  type: application
8
- version: 1.11.0
8
+ version: 1.12.0
@@ -12,4 +12,8 @@ spec:
12
12
  port: {{ .Values.port }}
13
13
  rules:
14
14
  {{- toYaml .Values.expose.rules | nindent 6 }}
15
+ {{ if .Values.expose.corsPolicy }}
16
+ corsPolicy:
17
+ {{- toYaml .Values.expose.corsPolicy | nindent 6 }}
18
+ {{- end }}
15
19
  {{- end }}
@@ -21,6 +21,21 @@ spec:
21
21
  - protocol: TCP
22
22
  port: {{ $port }}
23
23
  {{- end }}
24
+ - from:
25
+ - podSelector:
26
+ matchLabels:
27
+ app.kubernetes.io/instance: ory
28
+ app.kubernetes.io/name: oathkeeper
29
+ namespaceSelector:
30
+ matchLabels:
31
+ kubernetes.io/metadata.name: kyma-system
32
+ ports:
33
+ - protocol: TCP
34
+ port: {{ .Values.port }}
35
+ {{- range $port := .Values.networkSecurity.additionalPorts }}
36
+ - protocol: TCP
37
+ port: {{ $port }}
38
+ {{- end }}
24
39
  {{- end }}
25
40
  {{- if .Values.prometheus.enabled }}
26
41
  - from:
@@ -605,6 +605,47 @@
605
605
  "$id": "#/properties/expose/properties/gateway",
606
606
  "type": "string"
607
607
  },
608
+ "corsPolicy": {
609
+ "$id": "#/properties/expose/properties/corsPolicy",
610
+ "type": "object",
611
+ "additionalProperties": false,
612
+ "properties": {
613
+ "allowHeaders": {
614
+ "type": "array",
615
+ "items": {
616
+ "type": "string"
617
+ }
618
+ },
619
+ "allowMethods": {
620
+ "type": "array",
621
+ "items": {
622
+ "type": "string"
623
+ }
624
+ },
625
+ "allowOrigins": {
626
+ "type": "array",
627
+ "items": {
628
+ "type": "object",
629
+ "propertyNames": {"enum": ["regex", "exact", "prefix"]},
630
+ "patternProperties": {
631
+ "": { "type": "string" }
632
+ }
633
+ }
634
+ },
635
+ "allowCredentials": {
636
+ "type": "boolean"
637
+ },
638
+ "exposeHeaders": {
639
+ "type": "array",
640
+ "items": {
641
+ "type": "string"
642
+ }
643
+ },
644
+ "maxAge": {
645
+ "type": "string"
646
+ }
647
+ }
648
+ },
608
649
  "rules": {
609
650
  "$id": "#/properties/expose/properties/rules",
610
651
  "type": "array",
@@ -15,7 +15,7 @@ global:
15
15
  _internal:
16
16
  web-application:
17
17
  versions:
18
- 1.11.0: true
18
+ 1.12.0: true
19
19
  ## Will be used instead of the `.Chart.Name`, e.g. when generating the Deployment name.
20
20
  # nameOverride: name
21
21
 
@@ -158,6 +158,24 @@ expose:
158
158
  - DELETE
159
159
  - HEAD
160
160
  path: /.*
161
+ ## APIRule CORS policy configuration
162
+ ## https://kyma-project.io/#/api-gateway/user/custom-resources/apirule/04-10-apirule-custom-resource
163
+ # corsPolicy:
164
+ # allowHeaders:
165
+ # - foo
166
+ # - bar
167
+ # allowMethods:
168
+ # - GET
169
+ # - POST
170
+ # allowCredentials: true
171
+ # exposeHeaders:
172
+ # - foo
173
+ # - bar
174
+ # maxAge: 3s
175
+ # allowOrigins:
176
+ # - regex: foo
177
+ # - exact: bar
178
+ # - prefix: baz
161
179
  prometheus:
162
180
  # Add annotations to the Service for Prometheus Service Discovery
163
181
  enabled: false
@@ -21,6 +21,6 @@ srv:
21
21
  memory: {{#isJava}}1G{{/isJava}}{{^isJava}}500M{{/isJava}}
22
22
  health:
23
23
  liveness:
24
- path: /
24
+ path: {{#isJava}}/{{/isJava}}{{^isJava}}/health{{/isJava}}
25
25
  readiness:
26
- path: /
26
+ path: {{#isJava}}/{{/isJava}}{{^isJava}}/health{{/isJava}}
@@ -1,14 +1,17 @@
1
1
  const cds = require('../../..')
2
2
  const { copy, rimraf, exists, fs } = cds.utils
3
3
  const { join } = require('path')
4
-
5
- // cds.build?.register('helm-unified-runtime', {
6
- // impl: '@cap-js-community/helm-unified-runtime/lib/build.js'
7
- // })
8
-
9
4
  const { merge, readProject } = cds.add ?? {}
10
5
 
11
- module.exports = class HelmUnifiedRuntimeTemplate extends cds.add.Plugin {
6
+ module.exports = class HelmUnifiedRuntimeTemplate extends require('../../plugin') {
7
+
8
+ options() {
9
+ return {
10
+ 'internal-unified-runtime-charts': {
11
+ type: 'boolean'
12
+ }
13
+ }
14
+ }
12
15
 
13
16
  async canRun() {
14
17
  if (cds.cli.options.force) {