@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.
- package/bin/add.js +42 -17
- package/bin/bind.js +21 -12
- package/bin/build.js +14 -2
- package/bin/deploy/to-sqlite.js +1 -1
- package/bin/help.js +4 -1
- package/bin/version.js +54 -22
- package/lib/bind/userCdsrcJsonStorageProvider.js +1 -1
- package/lib/build/buildTaskFactory.js +2 -2
- package/lib/build/provider/hana/index.js +1 -1
- package/lib/build/provider/internalBuildTaskProvider.js +19 -5
- package/lib/build/provider/mtx/resourcesTarBuilder.js +16 -4
- package/lib/build/provider/mtx-extension/extensionCompilation.js +13 -2
- package/lib/build/provider/mtx-extension/index.js +6 -2
- package/lib/build/provider/nodejs/index.js +4 -4
- package/lib/build/util.js +1 -12
- package/lib/compile/openapi/index.js +2 -1
- package/lib/index.js +2 -2
- package/lib/init/constants.js +2 -1
- package/lib/init/index.js +9 -23
- package/lib/init/plugin.js +8 -0
- package/lib/init/registries/mta.js +6 -0
- package/lib/init/template/data/as-csv.js +60 -0
- package/lib/init/template/data/as-json.js +441 -0
- package/lib/init/template/data/index.js +115 -86
- package/lib/init/template/helm/files/content-deployment/Chart.yaml +1 -1
- package/lib/init/template/helm/files/content-deployment/templates/job.yaml +7 -0
- package/lib/init/template/helm/files/content-deployment/values.schema.json +17 -0
- package/lib/init/template/helm/files/content-deployment/values.yaml +6 -1
- package/lib/init/template/helm/files/service-instance/Chart.yaml +1 -1
- package/lib/init/template/helm/files/service-instance/templates/serviceinstance.yaml +4 -0
- package/lib/init/template/helm/files/service-instance/values.schema.json +17 -1
- package/lib/init/template/helm/files/service-instance/values.yaml +4 -1
- package/lib/init/template/helm/files/values.yaml.hbs +2 -2
- package/lib/init/template/helm/files/web-application/Chart.yaml +1 -1
- package/lib/init/template/helm/files/web-application/templates/api-rule.yaml +4 -0
- package/lib/init/template/helm/files/web-application/templates/network-policy.yaml +15 -0
- package/lib/init/template/helm/files/web-application/values.schema.json +41 -0
- package/lib/init/template/helm/files/web-application/values.yaml +19 -1
- package/lib/init/template/helm-unified-runtime/files/values.yaml.hbs +2 -2
- package/lib/init/template/helm-unified-runtime/index.js +9 -6
- package/lib/init/template/http/index.js +182 -0
- package/lib/init/template/kafka/files/mta.yaml.hbs +14 -0
- package/lib/init/template/kafka/files/package.json.hbs +22 -0
- package/lib/init/template/kafka/index.js +40 -0
- package/lib/init/template/lint/index.js +4 -4
- package/lib/init/template/mta/files/mta.yaml.hbs +4 -0
- package/lib/init/template/multitenancy/files/values.yaml.hbs +2 -2
- package/lib/util/cf.js +6 -2
- package/npm-shrinkwrap.json +13 -13
- 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
|
|
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
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
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
|
|
23
|
-
const
|
|
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
|
-
|
|
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
|
-
|
|
31
|
-
|
|
32
|
-
|
|
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
|
-
|
|
35
|
-
csn = cds.reflect(csn); // reflected model (adds additional helper functions)
|
|
73
|
+
await asJson(data, csn, records)
|
|
36
74
|
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
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
|
-
|
|
46
|
-
|
|
47
|
-
|
|
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
|
|
73
|
-
|
|
74
|
-
const
|
|
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}
|
|
119
|
+
dataFileName = `${entity.name}`
|
|
77
120
|
}
|
|
78
121
|
else {
|
|
79
|
-
const entityName = entity.name.replace(namespace + '.', '')
|
|
80
|
-
dataFileName = `${namespace}-${entityName}
|
|
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
|
-
|
|
91
|
-
|
|
136
|
+
dataFileName = dataFileNameOldFormat
|
|
137
|
+
dataFilePath = join(dest, dataFileName)
|
|
138
|
+
fileExists = true
|
|
92
139
|
}
|
|
93
140
|
}
|
|
94
141
|
|
|
95
|
-
|
|
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
|
-
|
|
114
|
-
|
|
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
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
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
|
|
128
|
-
const
|
|
129
|
-
|
|
130
|
-
|
|
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
|
}
|
|
@@ -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.
|
|
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: {}
|
|
@@ -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
|
+
}
|
|
@@ -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.
|
|
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
|
|
@@ -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
|
|
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) {
|