@sap/cds-dk 9.1.3 → 9.2.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 (68) hide show
  1. package/CHANGELOG.md +31 -0
  2. package/bin/cds.js +2 -0
  3. package/bin/repl.js +4 -2
  4. package/bin/up.js +11 -1
  5. package/bin/util/log.js +8 -1
  6. package/bin/version.js +20 -15
  7. package/lib/bind/shared.js +3 -1
  8. package/lib/build/plugins/helm/files/subcharts/web-application/Chart.yaml +1 -1
  9. package/lib/build/plugins/helm/files/subcharts/web-application/templates/_helpers.tpl +1 -1
  10. package/lib/build/plugins/helm/files/subcharts/web-application/templates/deployment.yaml +8 -0
  11. package/lib/build/plugins/helm/files/subcharts/web-application/templates/virtual-service.yaml +38 -0
  12. package/lib/build/plugins/helm/files/subcharts/web-application/values.schema.json +15 -0
  13. package/lib/build/plugins/helm/files/subcharts/web-application/values.yaml +12 -9
  14. package/lib/build/plugins/helm/index.js +1 -1
  15. package/lib/build/provider/hana/index.js +5 -4
  16. package/lib/build/provider/hana/template/.hdiconfig-all +6 -0
  17. package/lib/compile/to-xsuaa.js +3 -2
  18. package/lib/init/constants.js +5 -3
  19. package/lib/init/index.js +6 -1
  20. package/lib/init/merge.js +7 -3
  21. package/lib/init/projectReader.js +4 -1
  22. package/lib/init/registries/mta.js +6 -0
  23. package/lib/init/template/ams/files/values.yaml.hbs +5 -0
  24. package/lib/init/template/approuter/files/containerize.yaml.hbs +1 -1
  25. package/lib/init/template/approuter/files/values.yaml.hbs +1 -5
  26. package/lib/init/template/data/as-json.js +4 -3
  27. package/lib/init/template/data/index.js +1 -0
  28. package/lib/init/template/destination/files/mta.yaml.hbs +1 -20
  29. package/lib/init/template/extension/index.js +1 -1
  30. package/lib/init/template/github-actions/files/cf-github-deploy/action.yaml +48 -0
  31. package/lib/init/template/github-actions/files/cf-setup/action.yaml +53 -0
  32. package/lib/init/template/github-actions/files/kyma-info/action.yaml +37 -0
  33. package/lib/init/template/github-actions/files/kyma-setup/action.yaml +64 -0
  34. package/lib/init/template/github-actions/files/workflows/cf.yaml.hbs +48 -0
  35. package/lib/init/template/github-actions/files/workflows/kyma.yaml.hbs +39 -0
  36. package/lib/init/template/github-actions/files/workflows/test.yaml.hbs +21 -0
  37. package/lib/init/template/github-actions/index.js +73 -0
  38. package/lib/init/template/helm/index.js +5 -1
  39. package/lib/init/template/html5-repo/files/containerize.yaml.hbs +4 -4
  40. package/lib/init/template/html5-repo/files/mta.yaml.hbs +24 -0
  41. package/lib/init/template/html5-repo/files/values.yaml.hbs +2 -1
  42. package/lib/init/template/html5-repo/index.js +9 -3
  43. package/lib/init/template/http/index.js +4 -4
  44. package/lib/init/template/ias/files/package.json.hbs +7 -0
  45. package/lib/init/template/ias/files/values.yaml.hbs +1 -4
  46. package/lib/init/template/ias/index.js +2 -1
  47. package/lib/init/template/kyma/index.js +10 -0
  48. package/lib/init/template/malware-scanner/index.js +1 -1
  49. package/lib/init/template/multitenancy/files/values.yaml.hbs +53 -1
  50. package/lib/init/template/multitenancy/index.js +0 -13
  51. package/lib/init/template/pipeline/files/Jenkinsfile +2 -2
  52. package/lib/init/template/pipeline/index.js +1 -1
  53. package/lib/init/template/portal/files/containerize.yaml.hbs +15 -0
  54. package/lib/init/template/portal/files/values.yaml.hbs +1 -1
  55. package/lib/init/template/portal/index.js +9 -1
  56. package/lib/init/template/sample/index.js +1 -1
  57. package/lib/init/template/test/index.js +1 -1
  58. package/lib/init/template/tiny-sample/index.js +1 -1
  59. package/lib/init/template/typescript/index.js +1 -1
  60. package/lib/init/template/workzone-standard/index.js +13 -4
  61. package/lib/init/template/xsuaa/files/mta.yaml.hbs +8 -0
  62. package/lib/init/template/xsuaa/index.js +11 -0
  63. package/lib/init/template.js +38 -26
  64. package/lib/lint/eslintHelp.json +1 -1
  65. package/lib/watch/watched.js +1 -1
  66. package/npm-shrinkwrap.json +22 -22
  67. package/package.json +1 -1
  68. /package/lib/init/template/html5-repo/files/{ui-resources/package.json.hbs → html5-deployer.package.json.hbs} +0 -0
@@ -20,6 +20,8 @@ module.exports = class IasTemplate extends require('../../plugin') {
20
20
  async run() {
21
21
  const project = readProject()
22
22
  const { configFile, isNodejs } = project
23
+ project.profile ??= 'production'
24
+ project.shortcut = typeof (await read(configFile)).cds?.requires?.auth !== 'object'
23
25
  await merge(__dirname, 'files/package.json.hbs').into(configFile, { project, forceOverwrite: true })
24
26
  if (isNodejs) await sort('package.json', 'dependencies')
25
27
  }
@@ -70,7 +72,6 @@ module.exports = class IasTemplate extends require('../../plugin') {
70
72
  const identity = { in: 'dependencies', where: { 'alias': 'identity' } }
71
73
  await merge(__dirname, 'files/Chart.yaml.hbs').into('chart/Chart.yaml', { project, additions: [identity] })
72
74
  await merge(__dirname, 'files/values.yaml.hbs').into('chart/values.yaml', { project })
73
- // TODO: MTX, approuter
74
75
  }
75
76
 
76
77
  if (hasCfManifest) {
@@ -0,0 +1,10 @@
1
+ module.exports = class extends require('../../plugin') {
2
+
3
+ static help() {
4
+ return 'helm + containerize'
5
+ }
6
+
7
+ requires() {
8
+ return ['helm', 'containerize']
9
+ }
10
+ }
@@ -5,7 +5,7 @@ const { srv4, malwareScanner } = require('../../registries/mta')
5
5
  module.exports = class MalwareScannerTemplate extends require('../../plugin') {
6
6
 
7
7
  static help() {
8
- return 'SAP Malware Scanning Service'
8
+ return 'SAP BTP Malware Scanning Service'
9
9
  }
10
10
 
11
11
  static hasInProduction(env) {
@@ -2,8 +2,14 @@
2
2
  srv:
3
3
  bindings:
4
4
  {{#isJava}}
5
+ {{#hasXsuaa}}
5
6
  saas-registry:
6
7
  serviceInstanceName: saas-registry
8
+ {{/hasXsuaa}}
9
+ {{^hasXsuaa}}
10
+ subscription-manager:
11
+ serviceInstanceName: subscription-manager
12
+ {{/hasXsuaa}}
7
13
  {{/isJava}}
8
14
  service-manager:
9
15
  serviceInstanceName: service-manager
@@ -14,10 +20,13 @@ srv:
14
20
  service-manager:
15
21
  serviceOfferingName: service-manager
16
22
  servicePlanName: container
23
+ {{#hasXsuaa}}
17
24
  saas-registry:
18
25
  serviceOfferingName: saas-registry
19
26
  servicePlanName: application
20
27
  parameters:
28
+ appName: {{appName}}-{{#literal}}{{ .Release.Namespace }}{{/literal}}
29
+ xsappname: {{appName}}-{{#literal}}{{ .Release.Namespace }}{{/literal}}
21
30
  displayName: {{appName}}
22
31
  description: {{appDescription}}
23
32
  category: "CAP Application"
@@ -25,21 +34,64 @@ saas-registry:
25
34
  onSubscriptionAsync: true
26
35
  onUnSubscriptionAsync: true
27
36
  onUpdateDependenciesAsync: true
28
- callbackTimeoutMillis: 300000
37
+ callbackTimeoutMillis: 300000{{#isJava}}{{#literal}}
38
+ getDependencies: https://{{ .Release.Name }}-srv-{{ .Release.Namespace }}.{{ .Values.global.domain }}/mt/v1.0/subscriptions/dependencies
39
+ onSubscription: https://{{ .Release.Name }}-srv-{{ .Release.Namespace }}.{{ .Values.global.domain }}/mt/v1.0/subscriptions/tenants/{tenantId}
40
+ {{/literal}}{{/isJava}}{{#isNodejs}}{{#literal}}
41
+ getDependencies: https://{{ .Release.Name }}-sidecar-{{ .Release.Namespace }}.{{ .Values.global.domain }}/-/cds/saas-provisioning/dependencies
42
+ onSubscription: https://{{ .Release.Name }}-sidecar-{{ .Release.Namespace }}.{{ .Values.global.domain }}/-/cds/saas-provisioning/tenant/{tenantId}
43
+ {{/literal}}{{/isNodejs}}
44
+ {{/hasXsuaa}}
45
+
46
+ {{^hasXsuaa}}
47
+ subscription-manager:
48
+ serviceOfferingName: subscription-manager
49
+ servicePlanName: provider
50
+ parameters:
51
+ appCallbacks:
52
+ dependenciesCallbacks:
53
+ {{#literal}}url: https://{{ .Release.Name }}-sidecar-{{ .Release.Namespace }}.cert.{{ .Values.global.domain }}/-/cds/sms-provisioning/dependencies/{app_tid}{{/literal}}
54
+ subscriptionCallbacks:
55
+ {{#literal}}url: https://{{ .Release.Name }}-sidecar-{{ .Release.Namespace }}.cert.{{ .Values.global.domain }}/-/cds/sms-provisioning/tenant/{app_tid}{{/literal}}
56
+ appName: {{appName}}
57
+ applicationType: application
58
+ category: "CAP Application"
59
+ description: {{appDescription}}
60
+ displayName: {{appName}}
61
+ subscribeEnable: true
62
+ unsubscribeEnable: true
63
+ iasServiceInstanceName: {{appName}}-identity
64
+ {{/hasXsuaa}}
65
+
29
66
  sidecar:
30
67
  bindings:
31
68
  {{#hasXsuaa}}
32
69
  auth:
33
70
  serviceInstanceName: xsuaa
34
71
  {{/hasXsuaa}}
72
+ {{#hasIas}}
73
+ auth:
74
+ serviceInstanceName: identity
75
+ {{/hasIas}}
35
76
  {{#isNodejs}}
77
+ {{#hasXsuaa}}
36
78
  saas-registry:
37
79
  serviceInstanceName: saas-registry
80
+ {{/hasXsuaa}}
81
+ {{^hasXsuaa}}
82
+ subscription-manager:
83
+ serviceInstanceName: subscription-manager
84
+ {{/hasXsuaa}}
38
85
  {{/isNodejs}}
39
86
  service-manager:
40
87
  serviceInstanceName: service-manager
41
88
  image:
42
89
  repository: {{appName}}-sidecar
90
+ {{#hasIas}}
91
+ expose:
92
+ gateway: default/kyma-mtls-gateway
93
+ {{#literal}}host: https://{{ .Release.Name }}-sidecar-{{ .Release.Namespace }}.cert.{{ .Values.global.domain }}{{/literal}}
94
+ {{/hasIas}}
43
95
  resources:
44
96
  limits:
45
97
  ephemeral-storage: 1G
@@ -85,20 +85,7 @@ module.exports = class MultitenancyTemplate extends require('../../plugin') {
85
85
  if (hasHelm || hasHelmUnifiedRuntime) {
86
86
  await merge(__dirname, 'files/values.yaml.hbs').into('chart/values.yaml', { with: project })
87
87
  const applicationWorkload = hasApprouter ? 'approuter' : 'srv'
88
- const mtServer = isNodejs ? 'sidecar' : 'srv'
89
- const prefix = `https://{{ .Release.Name }}-${mtServer}-{{ .Release.Namespace }}.{{ .Values.global.domain }}`
90
- const getDependencies = `${prefix}${isNodejs ? '/-/cds/saas-provisioning' : '/mt/v1.0/subscriptions'}/dependencies`
91
- const onSubscription = `${prefix}${isNodejs ? '/-/cds/saas-provisioning/tenant/{tenantId}' : '/mt/v1.0/subscriptions/tenants/{tenantId}'}`
92
88
  await merge({
93
- 'saas-registry': {
94
- parameters: {
95
- xsappname: `${appName}-{{ .Release.Namespace }}`,
96
- appName: `${appName}-{{ .Release.Namespace }}`,
97
- appUrls: {
98
- getDependencies, onSubscription
99
- }
100
- }
101
- },
102
89
  ...(isNodejs) && { sidecar: { env: {
103
90
  SUBSCRIPTION_URL: `https://\${tenant_subdomain}-{{ .Release.Name }}-${applicationWorkload}-{{ .Release.Namespace }}.{{ .Values.global.domain }}`
104
91
  }}},
@@ -1,4 +1,4 @@
1
- #!/usr/bin/env groovy
1
+ #!/usr/bin/env groovy
2
2
 
3
3
  /*
4
4
  * This file bootstraps the codified Continuous Delivery pipeline for extensions of SAP solutions such as SAP S/4HANA.
@@ -9,4 +9,4 @@
9
9
 
10
10
  @Library('piper-lib-os') _
11
11
 
12
- piperPipeline script: this
12
+ piperPipeline script: this
@@ -8,7 +8,7 @@ const { URLS } = require('../../constants')
8
8
  module.exports = class PipelineTemplate extends require('../../plugin') {
9
9
 
10
10
  static help() {
11
- return 'CI/CD pipeline integration'
11
+ return 'CI/CD pipeline via Jenkins (Piper)'
12
12
  }
13
13
 
14
14
  async canRun() {
@@ -0,0 +1,15 @@
1
+ ---
2
+ modules:
3
+ - name: {{appName}}-portal-deployer
4
+ build-parameters:
5
+ buildpack:
6
+ {{#hasHelmUnifiedRuntime}}
7
+ builder: proxy-unified-runtime-dmz.int.repositories.cloud.sap/builder/noble
8
+ {{/hasHelmUnifiedRuntime}}
9
+ {{^hasHelmUnifiedRuntime}}
10
+ type: nodejs
11
+ builder: builder-jammy-base
12
+ {{/hasHelmUnifiedRuntime}}
13
+ path: app/portal
14
+ env:
15
+ BP_NODE_RUN_SCRIPTS: ""
@@ -8,7 +8,7 @@ portal:
8
8
  servicePlanName: standard
9
9
  portal-deployer:
10
10
  image:
11
- repository: {{appName}}-portalcontent
11
+ repository: {{appName}}-portal-deployer
12
12
  resources:
13
13
  limits:
14
14
  ephemeral-storage: 1G
@@ -29,7 +29,7 @@ module.exports = class PortalTemplate extends require('../../plugin') {
29
29
 
30
30
  async combine() {
31
31
  const project = readProject()
32
- const { isJava, hasMta, srvPath, hasHtml5Repo, hasXsuaa, hasApprouter, hasMultitenancy, hasHelm, hasHelmUnifiedRuntime } = project
32
+ const { appName, isJava, hasMta, srvPath, hasHtml5Repo, hasXsuaa, hasApprouter, hasMultitenancy, hasHelm, hasHelmUnifiedRuntime, hasContainerize } = project
33
33
 
34
34
  if (hasMultitenancy) {
35
35
  await merge(__dirname, 'files/package.sidecar.json').into('mtx/sidecar/package.json')
@@ -81,6 +81,14 @@ module.exports = class PortalTemplate extends require('../../plugin') {
81
81
  })
82
82
  }
83
83
 
84
+ if (hasContainerize) {
85
+ const additions = [{
86
+ in: 'modules',
87
+ where: { name: `${appName}-portal-deployer` }
88
+ }]
89
+ await merge(__dirname, '/files/containerize.yaml.hbs').into('containerize.yaml', { with: project, additions })
90
+ }
91
+
84
92
  if (hasHelm || hasHelmUnifiedRuntime) {
85
93
  await merge(__dirname, 'files/values.yaml.hbs').into('chart/values.yaml', { with: project })
86
94
  }
@@ -8,7 +8,7 @@ const mvn = require('../../mvn')
8
8
  module.exports = class SampleTemplate extends require('../../plugin') {
9
9
 
10
10
  static help() {
11
- return 'add sample files including Fiori UI'
11
+ return 'sample files including Fiori UI'
12
12
  }
13
13
 
14
14
  async run() {
@@ -1,5 +1,5 @@
1
1
  const cds = require('../../../cds')
2
- const { fs: { promises: { rename } }, path: { basename, dirname, join }, exists } = cds.utils
2
+ const { fs: { promises: { rename } }, path: { dirname, join }, exists } = cds.utils
3
3
  const { readProject } = require('../../projectReader')
4
4
  const { merge } = require('../../merge')
5
5
  const { renderAndCopy } = require('../../template')
@@ -8,7 +8,7 @@ const { JAVA } = require('../../constants')
8
8
  module.exports = class TinySampleTemplate extends require('../../plugin') {
9
9
 
10
10
  static help() {
11
- return 'add minimal sample files'
11
+ return 'minimal sample files'
12
12
  }
13
13
 
14
14
  async run() {
@@ -8,7 +8,7 @@ const TyperTemplate = require('../typer')
8
8
 
9
9
  module.exports = class TypescriptTemplate extends require('../../plugin') {
10
10
  static help() {
11
- return 'add minimum configuration for a bare TypeScript project'
11
+ return 'minimum configuration for a bare TypeScript project'
12
12
  }
13
13
 
14
14
  async canRun() {
@@ -1,5 +1,5 @@
1
1
  const cds = require('../../../cds')
2
- const { read, write } = cds.utils
2
+ const { read, write, exists } = cds.utils
3
3
  const { readProject } = require('../../projectReader')
4
4
  const { merge } = require('../../merge')
5
5
  const { join } = require('path')
@@ -40,11 +40,20 @@ module.exports = class extends require('../../plugin') {
40
40
 
41
41
  async combine() {
42
42
  const project = readProject()
43
- const { isJava, hasMta, srvPath, apps, appPath, appUIPaths, hasMultitenancy } = project
43
+ const { isJava, hasMta, srvPath, apps, appPath, appUIPaths, hasMultitenancy, strippedAppName } = project
44
44
 
45
- await Promise.all(appUIPaths.map(p => {
45
+ await Promise.all(appUIPaths.map(async p => {
46
46
  project.uiApp = p
47
- return merge(__dirname, 'files/manifest.json.hbs').into(join(appPath, p, 'webapp/manifest.json'), { project })
47
+ const manifestPath = join(appPath, p, 'webapp/manifest.json')
48
+ const manifest = exists(manifestPath) ? await read(manifestPath) : {}
49
+ if (!manifest['sap.app'].crossNavigation.inbounds) {
50
+ return merge(__dirname, 'files/manifest.json.hbs').into(join(appPath, p, 'webapp/manifest.json'), { project })
51
+ } else {
52
+ return merge({ 'sap.cloud': {
53
+ public: true,
54
+ service: `${strippedAppName}.service`
55
+ }}).into(join(appPath, p, 'webapp/manifest.json'), { project })
56
+ }
48
57
  }))
49
58
 
50
59
  await Promise.all(apps.map(async ({ app }) => {
@@ -24,3 +24,11 @@ resources:
24
24
  config:
25
25
  xsappname: {{appName}}-${org}-${space}
26
26
  tenant-mode: {{#hasMultitenancy}}shared{{/hasMultitenancy}}{{^hasMultitenancy}}dedicated{{/hasMultitenancy}}
27
+ {{#hasRoles}}
28
+ role-collections:
29
+ {{#roles}}
30
+ - name: '{{name}} ({{appName}} ${org}-${space})'
31
+ description: 'generated'
32
+ role-template-references: ['$XSAPPNAME.{{name}}']
33
+ {{/roles}}
34
+ {{/hasRoles}}
@@ -63,6 +63,17 @@ module.exports = class XsuaaTemplate extends require('../../plugin') {
63
63
  into: [mtxSidecar, 'requires', 'name']
64
64
  })
65
65
  if (plan) project.servicePlan = plan
66
+
67
+ project.hasRoles = xsSecurity['role-templates'].length > 0
68
+ project.roles = xsSecurity['role-templates'].map(role => role)
69
+
70
+ for (const role of xsSecurity['role-templates']) {
71
+ additions.push({
72
+ in: [xsuaa, 'parameters.role-collections'],
73
+ where: { 'role-template-references': ['XSAPPNAME'+role.name] }
74
+ })
75
+ }
76
+
66
77
  await merge(__dirname, 'files/mta.yaml.hbs').into('mta.yaml', { project, additions, overwrites, relationships })
67
78
  }
68
79
 
@@ -1,34 +1,46 @@
1
1
  const Mustache = require('mustache')
2
2
  const cds = require('../cds')
3
- const { copy, read, write, exists, readdir, path, isdir } = cds.utils
4
-
5
- async function renderAndCopy(from, into, replacements, overwrite = cds.cli.options.force) {
6
- const dirents = await readdir(from)
7
- await Promise.all(dirents.map(async dirent => {
8
- const fileNew = Mustache.render(dirent, replacements)
9
- const src = path.join(from, dirent)
10
- const dest = path.join(into, fileNew)
11
-
12
- if (isdir(src)) {
13
- return renderAndCopy(path.join(from, dirent), dest, replacements, overwrite)
14
- } else if (path.extname(dirent) === '.hbs') {
15
- const destinationPath = dest.replace('.hbs', '')
16
- if (overwrite || !exists(destinationPath)) {
17
- const content = await render(src, replacements)
18
- await write(destinationPath, content, { spaces: 2 })
19
- }
20
- } else {
21
- return copy(src, dest)
22
- }
23
- }))
3
+ const { copy, read, write, exists, readdir, path, isdir, mkdirp } = cds.utils
4
+
5
+ async function renderAndCopy(from, into = '.', replacements = {}, overwrite = cds.cli.options.force) {
6
+ const srcRoot = path.resolve(from)
7
+ const destRoot = path.resolve(cds.root, into)
8
+
9
+ async function walk(src, dest) {
10
+ if (isdir(src)) {
11
+ await mkdirp(dest)
12
+ const entries = await readdir(src)
13
+ return Promise.all(entries.map(name => {
14
+ const renderedName = Mustache.render(name, replacements)
15
+ return walk(path.join(src, name), path.join(dest, renderedName))
16
+ }))
17
+ }
18
+
19
+ const extension = path.extname(src)
20
+
21
+ if (extension === '.hbs') {
22
+ const destFile = dest.replace(/\.hbs$/, '')
23
+ if (overwrite || !exists(destFile)) {
24
+ const content = await render(src, replacements)
25
+ await write(destFile, content, { spaces: 2 })
26
+ }
27
+ return
28
+ }
29
+
30
+ if (overwrite || !exists(dest)) {
31
+ await copy(src, dest)
32
+ }
33
+ }
34
+
35
+ return walk(srcRoot, destRoot)
24
36
  }
25
37
 
26
- async function render(src, templateValues) {
27
- const content = await read(src, 'utf-8')
28
- return Mustache.render(content, templateValues)
38
+ async function render(templatePath, values = {}) {
39
+ const content = await read(templatePath, 'utf-8')
40
+ return Mustache.render(content, values)
29
41
  }
30
42
 
31
43
  module.exports = {
32
- render,
33
- renderAndCopy
44
+ render,
45
+ renderAndCopy
34
46
  }
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "9.30.1",
2
+ "version": "9.32.0",
3
3
  "help": "\n# SYNOPSIS\n\n *cds lint* [options] file.js [file.js] [dir]\n\n Runs environment checks and/or checks the specified models\n based on the ESLint framework\n\n# OPTIONS\n \n Basic configuration:\n --no-config-lookup Disable look up for eslint.config.js\n -c, --config path::String Use this configuration instead of eslint.config.js, eslint.config.mjs, or eslint.config.cjs\n --inspect-config Open the config inspector with the current configuration\n --ext [String] Specify additional file extensions to lint\n --global [String] Define global variables\n --parser String Specify the parser to be used\n --parser-options Object Specify parser options\n \n Specify Rules and Plugins:\n --plugin [String] Specify plugins\n --rule Object Specify rules\n \n Fix Problems:\n --fix Automatically fix problems\n --fix-dry-run Automatically fix problems without saving the changes to the file system\n --fix-type Array Specify the types of fixes to apply (directive, problem, suggestion, layout)\n \n Ignore Files:\n --no-ignore Disable use of ignore files and patterns\n --ignore-pattern [String] Patterns of files to ignore\n \n Use stdin:\n --stdin Lint code provided on <STDIN> - default: false\n --stdin-filename String Specify filename to process STDIN as\n \n Handle Warnings:\n --quiet Report errors only - default: false\n --max-warnings Int Number of warnings to trigger nonzero exit code - default: -1\n \n Output:\n -o, --output-file path::String Specify file to write report to\n -f, --format String Use a specific output format - default: stylish\n --color, --no-color Force enabling/disabling of color\n \n Inline configuration comments:\n --no-inline-config Prevent comments from changing config or rules\n --report-unused-disable-directives Adds reported errors for unused eslint-disable and eslint-enable directives\n --report-unused-disable-directives-severity String Chooses severity level for reporting unused eslint-disable and eslint-enable directives - either: off, warn, error, 0, 1, or 2\n --report-unused-inline-configs String Adds reported errors for unused eslint inline config comments - either: off, warn, error, 0, 1, or 2\n \n Caching:\n --cache Only check changed files - default: false\n --cache-file path::String Path to the cache file. Deprecated: use --cache-location - default: .eslintcache\n --cache-location path::String Path to the cache file or directory\n --cache-strategy String Strategy to use for detecting changed files in the cache - either: metadata or content - default: metadata\n \n Suppressing Violations:\n --suppress-all Suppress all violations - default: false\n --suppress-rule [String] Suppress specific rules\n --suppressions-location path::String Specify the location of the suppressions file\n --prune-suppressions Prune unused suppressions - default: false\n --pass-on-unpruned-suppressions Ignore unused suppressions - default: false\n \n Miscellaneous:\n --init Run config initialization wizard - default: false\n --env-info Output execution environment information - default: false\n --no-error-on-unmatched-pattern Prevent errors when pattern is unmatched\n --exit-on-fatal-error Exit with exit code 2 in case of fatal error - default: false\n --no-warn-ignored Suppress warnings when the file list includes ignored files\n --pass-on-no-patterns Exit with exit code 0 in case no file patterns are passed\n --debug Output debugging information\n -h, --help Show help\n -v, --version Output the version number\n --print-config path::String Print the configuration for the given file\n --stats Add statistics to the lint report - default: false\n --flag [String] Enable a feature flag\n --mcp Start the ESLint MCP server\n \n",
4
4
  "options": [
5
5
  "--config",
@@ -16,7 +16,7 @@
16
16
 
17
17
  try {
18
18
  await bootstrap
19
- if (!cds.service.providers.length) return _no_services_found()
19
+ if (cds.service.providers.length === 0) return _no_services_found()
20
20
  } catch (e) { switch (e.code) {
21
21
  case 'NO_SERVICES_FOUND': return _no_services_found(e)
22
22
  case 'MODEL_NOT_FOUND': return _no_models_found(e)
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "@sap/cds-dk",
3
- "version": "9.1.2",
3
+ "version": "9.2.0",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "@sap/cds-dk",
9
- "version": "9.1.2",
9
+ "version": "9.2.0",
10
10
  "license": "SEE LICENSE IN LICENSE",
11
11
  "dependencies": {
12
12
  "@cap-js/asyncapi": "^1.0.0",
@@ -42,8 +42,8 @@
42
42
  }
43
43
  },
44
44
  "node_modules/@cap-js/db-service": {
45
- "version": "2.2.0",
46
- "integrity": "sha512-C5n8Qy8MwOGWjpXS44CskaEZt8YKrEEs4AtJyBSfJ6+aKMu/ynqpXh0Up4Ql0XX2Frq2PwNU8Ohai/04wxd46g==",
45
+ "version": "2.3.0",
46
+ "integrity": "sha512-KkYrnI05bx0PvwP5jxEUos8UQ+XYPucUMQt3i0muQXWJw3rEkWvEArvOwCYjTNnjzHqtVQfpPXsy1+ehkHUrWg==",
47
47
  "devOptional": true,
48
48
  "license": "Apache-2.0",
49
49
  "dependencies": {
@@ -78,8 +78,8 @@
78
78
  }
79
79
  },
80
80
  "node_modules/@eslint/js": {
81
- "version": "9.31.0",
82
- "integrity": "sha512-LOm5OVt7D4qiKCqoiPbA7LWmI+tbw1VbTUowBcUMgQSuM6poJufkFkYDcQpo5KfgD39TnNySV26QjOh7VFpSyw==",
81
+ "version": "9.32.0",
82
+ "integrity": "sha512-BBpRFZK3eX6uMLKz8WxFOBIFFcGFJ/g8XuwjTHCqHROSIsopI+ddn/d5Cfh36+7+e5edVS8dbSHnBNhrLEX0zg==",
83
83
  "license": "MIT",
84
84
  "peer": true,
85
85
  "engines": {
@@ -90,8 +90,8 @@
90
90
  }
91
91
  },
92
92
  "node_modules/@sap/cds": {
93
- "version": "9.1.0",
94
- "integrity": "sha512-i5bAVbFzi1uN11O4U6SdPKzYDDxc+YDSWMiqt1ryxT0WYrrehJPg5pJQjy4AH1EgRIqa3eqK2RfmHS6SgkBOyg==",
93
+ "version": "9.2.0",
94
+ "integrity": "sha512-u/R+Bzz8RsiL4JINwwmbPFmSD8Y10PGpXetGHYvUyefUG/V/S8OBAWy/elu4FmTr1X8J4+kuynCgoETaWRveKw==",
95
95
  "license": "SEE LICENSE IN LICENSE",
96
96
  "dependencies": {
97
97
  "@sap/cds-compiler": "^6",
@@ -99,7 +99,7 @@
99
99
  "js-yaml": "^4.1.0"
100
100
  },
101
101
  "bin": {
102
- "cds-deploy": "lib/dbs/cds-deploy.js",
102
+ "cds-deploy": "bin/deploy.js",
103
103
  "cds-serve": "bin/serve.js"
104
104
  },
105
105
  "engines": {
@@ -120,8 +120,8 @@
120
120
  }
121
121
  },
122
122
  "node_modules/@sap/cds-compiler": {
123
- "version": "6.1.0",
124
- "integrity": "sha512-s71fsxDZKqHn2xvoqoNst54K/BkBzCpiU+8xc0t3nMDXmsLzSC3VfygZGwGAZD8fkxUnXh8oL2XLHWKWcvcdNg==",
123
+ "version": "6.2.2",
124
+ "integrity": "sha512-LqRNfBsWnEJpXVJ6/v52VqAdelWoETLbECMPcy7BfoHE63DGBpKA/ZIgoH11t7vUm7GYQDcSfR7ryy02Q/fP7A==",
125
125
  "license": "SEE LICENSE IN LICENSE",
126
126
  "bin": {
127
127
  "cdsc": "bin/cdsc.js",
@@ -142,8 +142,8 @@
142
142
  }
143
143
  },
144
144
  "node_modules/@sap/cds-mtxs": {
145
- "version": "3.1.0",
146
- "integrity": "sha512-ifE6RdiqIYz8OXOQYlEy0BYSHYN18T0d5kjSejX8svYsRyq//YsdxjybCFzOE3lgbHzfKsmAoe+ANx+99mhOwg==",
145
+ "version": "3.2.0",
146
+ "integrity": "sha512-8X+fK0rsnOaKZpettVAXuzCJT9MRebpuzN1JjNEWPiYVafvIjXIQc2diYgq8rtzhfdFWk6QNlZUjMM7jLgNfsw==",
147
147
  "license": "SEE LICENSE IN LICENSE",
148
148
  "dependencies": {
149
149
  "@sap/hdi-deploy": "^5"
@@ -157,8 +157,8 @@
157
157
  }
158
158
  },
159
159
  "node_modules/@sap/hdi": {
160
- "version": "4.7.0",
161
- "integrity": "sha512-iA7W3en3QdZBTialmbomB2E6q4mP/b2Z2S2juhyQpbG7jPhc9jcL3S2wMkDv1XF3RJ5bmm6S/QwiSPtuCfI3LQ==",
160
+ "version": "4.8.0",
161
+ "integrity": "sha512-tkJmY2ffm6mt4/LFwRBihlQkMxNAXa3ngvRe2N/6+qLIsUNdrH/M03S5mkygXq56K+KoVVZYuradajCusMWwsw==",
162
162
  "license": "See LICENSE file",
163
163
  "dependencies": {
164
164
  "async": "^3.2.3"
@@ -168,7 +168,7 @@
168
168
  },
169
169
  "peerDependencies": {
170
170
  "@sap/hana-client": "^2 >= 2.5",
171
- "hdb": "^0"
171
+ "hdb": "^2 || ^0"
172
172
  },
173
173
  "peerDependenciesMeta": {
174
174
  "@sap/hana-client": {
@@ -180,11 +180,11 @@
180
180
  }
181
181
  },
182
182
  "node_modules/@sap/hdi-deploy": {
183
- "version": "5.4.2",
184
- "integrity": "sha512-v+u7kEyC5BT5S2ppOacRRBFwTGXVwu7tU83AMM5n/TzBMukdTE58+rMSFjvpm78Uy8ct2K+1W+xFS+Nx96b+6Q==",
183
+ "version": "5.5.0",
184
+ "integrity": "sha512-nxamWIBz+D/4wcvgYgxGSJLsyJ1KNtU9X6gfMHiyi/IjozGN/3WdeT11++jy5qeZNkdinuND55RRlRcnsu3W5g==",
185
185
  "license": "See LICENSE file",
186
186
  "dependencies": {
187
- "@sap/hdi": "^4.7.0",
187
+ "@sap/hdi": "^4.8.0",
188
188
  "@sap/xsenv": "^5.2.0",
189
189
  "async": "^3.2.6",
190
190
  "dotenv": "^16.4.5",
@@ -196,7 +196,7 @@
196
196
  },
197
197
  "peerDependencies": {
198
198
  "@sap/hana-client": "^2 >= 2.6",
199
- "hdb": "^0"
199
+ "hdb": "^2 || ^0"
200
200
  },
201
201
  "peerDependenciesMeta": {
202
202
  "@sap/hana-client": {
@@ -789,8 +789,8 @@
789
789
  "license": "MIT"
790
790
  },
791
791
  "node_modules/follow-redirects": {
792
- "version": "1.15.9",
793
- "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==",
792
+ "version": "1.15.10",
793
+ "integrity": "sha512-V7O/fFKM539IC2bweloFWuoiJ9OtI3W2uIqJPWM8IT5xxNyt73QtvVqmSpcDmk07ivmmlKB+rRY0vpQjIYNtKw==",
794
794
  "funding": [
795
795
  {
796
796
  "type": "individual",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sap/cds-dk",
3
- "version": "9.1.3",
3
+ "version": "9.2.0",
4
4
  "description": "Command line client and development toolkit for the SAP Cloud Application Programming Model",
5
5
  "homepage": "https://cap.cloud.sap/",
6
6
  "keywords": [