diff --git a/.github/workflows/conventional-commits.yml b/.github/workflows/conventional-commits.yml new file mode 100644 index 000000000..b6f870be3 --- /dev/null +++ b/.github/workflows/conventional-commits.yml @@ -0,0 +1,38 @@ +name: 'Adheres to conventional commit standard' + +on: + pull_request_target: + types: + - opened + - edited + - synchronize + +permissions: + pull-requests: read + +jobs: + main: + name: Validate PR title + runs-on: ubuntu-latest + steps: + - uses: amannn/action-semantic-pull-request@v5 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + # Configure which types are allowed (newline-delimited). + # Default: https://github.com/commitizen/conventional-commit-types + types: | + feat + fix + docs + style + refactor + perf + test + build + ci + chore + revert + wip + deps + diff --git a/.reuse/dep5 b/.reuse/dep5 index 844644ae2..73bfe6851 100644 --- a/.reuse/dep5 +++ b/.reuse/dep5 @@ -27,3 +27,14 @@ Disclaimer: The code in this project may include calls to APIs ("API Calls") of Files: * Copyright: 2022 SAP SE or an SAP affiliate company and cds-dbs contributors License: Apache-2.0 + +Files: + postgres/test/beershop/* + postgres/test/odata-string-functions.test.js + postgres/test/ql.test.js + postgres/test/service.test.js +Copyright: + 2022 SAP SE or an SAP affiliate company and cds-dbs contributors + Copyright (c) 2020 SAP Mentors & Friends +License: MIT +Comment: The content of these files, entirely or in part, comes from https://github.com/sapmentors/cds-pg, which is MIT licensed. diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index a6affea7b..25ef66b78 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -53,8 +53,18 @@ The `type` can be any of `feat`, `fix` or `chore`. The prefix is used to calculate the semver release level, and the section of the release notes to place the commit message in. -| **type** | when to use | release level | release note section | -| --------- | ----------------------------------- | ------------- | -------------------- | -| feat | a feature has been added | `minor` | **Features** | -| fix | a bug has been patched | `patch` | **Bug fixes** | -| chore | any changes that aren't user-facing | none | none | +| **type** | When to Use | Release Level | Release Note Section | +| ---------- | ----------------------------------- | ------------- | -------------------- | +| feat | A feature has been added | `minor` | **Added** | +| fix | A bug has been patched | `patch` | **Fixed** | +| deps | Changes to the dependencies | `patch` | **Changed** | +| perf | Performance improvements | none | **Performance Improvements** | +| chore | Any changes that aren't user-facing | none | none | +| docs | Documentation updates | none | none | +| style | Code style and formatting changes | none | none | +| refactor | Code refactoring | none | none | | +| test | Adding tests or test-related changes| none | none | +| build | Build system or tooling changes | none | none | +| ci | Continuous Integration/Deployment | none | none | +| revert | Reverting a previous commit | none | none | +| wip | Work in progress (temporary) | none | none | diff --git a/LICENSES/MIT.txt b/LICENSES/MIT.txt new file mode 100644 index 000000000..2071b23b0 --- /dev/null +++ b/LICENSES/MIT.txt @@ -0,0 +1,9 @@ +MIT License + +Copyright (c) + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/db-service/lib/cqn4sql.js b/db-service/lib/cqn4sql.js index 87d2a8d08..8d972fefe 100644 --- a/db-service/lib/cqn4sql.js +++ b/db-service/lib/cqn4sql.js @@ -96,7 +96,46 @@ function cqn4sql(originalQuery, model = cds.context?.model || cds.model) { } if (queryNeedsJoins) { - transformedQuery[kind].from = translateAssocsToJoins(transformedQuery[kind].from) + if (inferred.UPDATE || inferred.DELETE) { + const prop = inferred.UPDATE ? 'UPDATE' : 'DELETE' + const subquery = { + SELECT: { + from: { ...transformedFrom }, + columns: [], // primary keys of the query target will be added later + where: [...transformedProp.where], + }, + } + // The alias of the original query is now the alias for the subquery + // so that potential references in the where clause to the alias match. + // Hence, replace the alias of the original query with the next + // available alias, so that each alias is unique. + const uniqueSubqueryAlias = getNextAvailableTableAlias(transformedFrom.as) + transformedFrom.as = uniqueSubqueryAlias + + // calculate the primary keys of the target entity, there is always exactly + // one query source for UPDATE / DELETE + const queryTarget = Object.values(originalQuery.sources)[0] + const keys = Object.values(queryTarget.elements).filter(e => e.key === true) + const primaryKey = { list: [] } + keys.forEach(k => { + // cqn4sql will add the table alias to the column later, no need to add it here + subquery.SELECT.columns.push({ ref: [k.name] }) + + // add the alias of the main query to the list of primary key references + primaryKey.list.push({ ref: [transformedFrom.as, k.name] }) + }) + + const transformedSubquery = cqn4sql(subquery) + + // replace where condition of original query with the transformed subquery + // correlate UPDATE / DELETE query with subquery by primary key matches + transformedQuery[prop].where = [primaryKey, 'in', transformedSubquery] + + if (prop === 'UPDATE') transformedQuery.UPDATE.entity = transformedFrom + else transformedQuery.DELETE.from = transformedFrom + } else { + transformedQuery[kind].from = translateAssocsToJoins(transformedQuery[kind].from) + } } } } diff --git a/db-service/lib/infer/index.js b/db-service/lib/infer/index.js index b83e547ee..2476750f0 100644 --- a/db-service/lib/infer/index.js +++ b/db-service/lib/infer/index.js @@ -680,10 +680,6 @@ function infer(originalQuery, model = cds.context?.model || cds.model) { ? { ref: [...baseColumn.ref, ...column.ref], $refLinks: [...baseColumn.$refLinks, ...column.$refLinks] } : column if (isColumnJoinRelevant(colWithBase)) { - if (originalQuery.UPDATE) - throw new Error( - 'Path expressions for UPDATE statements are not supported. Use “where exists” with infix filters instead.', - ) Object.defineProperty(column, 'isJoinRelevant', { value: true }) joinTree.mergeColumn(colWithBase, originalQuery.outerQueries) } @@ -873,20 +869,26 @@ function infer(originalQuery, model = cds.context?.model || cds.model) { if (leafOfCalculatedElementRef.value) mergePathsIntoJoinTree(leafOfCalculatedElementRef.value, basePath) mergePathIfNecessary(basePath, arg) - } else if (arg.xpr) { - arg.xpr.forEach(step => { + } else if (arg.xpr || arg.args) { + const prop = arg.xpr ? 'xpr' : 'args' + arg[prop].forEach(step => { + const subPath = { $refLinks: [...basePath.$refLinks], ref: [...basePath.ref] } if (step.ref) { - const subPath = { $refLinks: [...basePath.$refLinks], ref: [...basePath.ref] } step.$refLinks.forEach((link, i) => { const { definition } = link if (definition.value) { - mergePathsIntoJoinTree(definition.value) + mergePathsIntoJoinTree(definition.value, subPath) } else { subPath.$refLinks.push(link) subPath.ref.push(step.ref[i]) } }) mergePathIfNecessary(subPath, step) + } else if (step.args || step.xpr) { + const nestedProp = step.xpr ? 'xpr' : 'args' + step[nestedProp].forEach(a => { + mergePathsIntoJoinTree(a, subPath) + }) } }) } diff --git a/db-service/test/bookshop/db/booksWithExpr.cds b/db-service/test/bookshop/db/booksWithExpr.cds index b037a764a..c21ab9caf 100644 --- a/db-service/test/bookshop/db/booksWithExpr.cds +++ b/db-service/test/bookshop/db/booksWithExpr.cds @@ -32,10 +32,15 @@ entity Books { authorAdrText = author.addressText; authorAge: Integer = years_between( author.sortCode, author.sortCode ); + authorAgeNativePG: Integer = DATE_PART('year', author.dateOfDeath) - DATE_PART('year', author.dateOfBirth); + + // calculated element is `xpr` which has subsequent `xpr` + authorAgeInDogYears: Integer = ( DATE_PART('year', author.dateOfDeath) - DATE_PART('year', author.dateOfBirth) ) * 7; } entity Authors { key ID : Integer; + firstName : String; lastName : String; diff --git a/db-service/test/cds-infer/calculated-elements.test.js b/db-service/test/cds-infer/calculated-elements.test.js index 0faa6690c..abec3665a 100644 --- a/db-service/test/cds-infer/calculated-elements.test.js +++ b/db-service/test/cds-infer/calculated-elements.test.js @@ -54,6 +54,8 @@ describe('Infer types of calculated elements in select list', () => { authorAdrText: Books.elements.authorAdrText, authorAge: Books.elements.authorAge, youngAuthorName: Books.elements.youngAuthorName, + authorAgeNativePG: Books.elements.authorAgeNativePG, + authorAgeInDogYears: Books.elements.authorAgeInDogYears, }) }) }) diff --git a/db-service/test/cqn4sql/DELETE.test.js b/db-service/test/cqn4sql/DELETE.test.js index c78c65417..9f8b370f8 100644 --- a/db-service/test/cqn4sql/DELETE.test.js +++ b/db-service/test/cqn4sql/DELETE.test.js @@ -69,6 +69,43 @@ describe('DELETE', () => { }`) expect(query.DELETE).to.deep.equal(expected.DELETE) }) + it('DELETE with where exists expansion and path expression', () => { + cds.model = cds.compile.for.nodejs(cds.model) + const { DELETE } = cds.ql + let d = DELETE.from('bookshop.Books:author').where(`books.title = 'Harry Potter'`) + const query = cqn4sql(d) + + // this is the final exists subquery + const subquery = CQL` + SELECT author.ID from bookshop.Authors as author + left join bookshop.Books as books on books.author_ID = author.ID + where exists ( + SELECT 1 from bookshop.Books as Books2 where Books2.author_ID = author.ID + ) and books.title = 'Harry Potter' + ` + const expected = JSON.parse(`{ + "DELETE": { + "from": { + "ref": [ + "bookshop.Authors" + ], + "as": "author2" + } + } + }`) + expected.DELETE.where = [ + { + list: [ + { + ref: ['author2', 'ID'], + }, + ], + }, + 'in', + subquery, + ] + expect(query.DELETE).to.deep.equal(expected.DELETE) + }) it('DELETE with assoc filter and where exists expansion', () => { const { DELETE } = cds.ql @@ -76,73 +113,57 @@ describe('DELETE', () => { const query = cqn4sql(d) const expected = { - "DELETE": { - "from": { - "ref": [ - "bookshop.AccessGroups" - ], - "as": "accessGroup" + DELETE: { + from: { + ref: ['bookshop.AccessGroups'], + as: 'accessGroup', }, - "where": [ - "exists", + where: [ + 'exists', { - "SELECT": { - "from": { - "ref": [ - "bookshop.Reproduce" - ], - "as": "Reproduce" + SELECT: { + from: { + ref: ['bookshop.Reproduce'], + as: 'Reproduce', }, - "columns": [ + columns: [ { - "val": 1 - } + val: 1, + }, ], - "where": [ + where: [ { - "ref": [ - "Reproduce", - "accessGroup_ID" - ] + ref: ['Reproduce', 'accessGroup_ID'], }, - "=", + '=', { - "ref": [ - "accessGroup", - "ID" - ] + ref: ['accessGroup', 'ID'], }, - "and", + 'and', { - "xpr": [ + xpr: [ { - "ref": [ - "Reproduce", - "author_ID" - ] + ref: ['Reproduce', 'author_ID'], }, - "=", + '=', { - "val": null - } - ] + val: null, + }, + ], }, - "and", + 'and', { - "ref": [ - "Reproduce", - "ID" - ] + ref: ['Reproduce', 'ID'], }, - "=", + '=', { - "val": 99 - } - ] - } - } - ] - } + val: 99, + }, + ], + }, + }, + ], + }, } expect(query.DELETE).to.deep.equal(expected.DELETE) }) diff --git a/db-service/test/cqn4sql/UPDATE.test.js b/db-service/test/cqn4sql/UPDATE.test.js index c3af06b51..7e23ffe44 100644 --- a/db-service/test/cqn4sql/UPDATE.test.js +++ b/db-service/test/cqn4sql/UPDATE.test.js @@ -70,17 +70,54 @@ describe('UPDATE', () => { }) }) - // we do not really understand a token stream such as a where clause, - // hence we cannot easily rewrite a path expression into a `where exists` subquery - // for the moment, we should issue a proper error instead of dumping. - it('Update with join clause is rejected', () => { + it('Update with path expressions in where is handled', () => { const { UPDATE } = cds.ql - let u = UPDATE.entity('bookshop.Books').where( + let u = UPDATE.entity({ ref: ['bookshop.Books'] }).where( `author.name LIKE '%Bron%' or ( author.name LIKE '%King' and title = 'The Dark Tower') and stock >= 15`, ) - expect(() => cqn4sql(u)).to.throw( - 'Path expressions for UPDATE statements are not supported. Use “where exists” with infix filters instead.', - ) + + let expected = UPDATE.entity({ ref: ['bookshop.Books'] }) + + expected.UPDATE.where = [ + { list: [{ ref: ['Books2', 'ID'] }] }, + 'in', + CQL` + (SELECT Books.ID from bookshop.Books as Books + left join bookshop.Authors as author on author.ID = Books.author_ID + where author.name LIKE '%Bron%' or ( author.name LIKE '%King' and Books.title = 'The Dark Tower') and Books.stock >= 15 + ) + `, + ] + expected.UPDATE.entity = { + as: 'Books2', + ref: ['bookshop.Books'], + } + let res = cqn4sql(u) + expect(JSON.parse(JSON.stringify(res))).to.deep.equal(JSON.parse(JSON.stringify(expected))) + }) + + it('Update with path expressions to many', () => { + const { UPDATE } = cds.ql + let u = UPDATE.entity({ ref: ['bookshop.Authors'] }).where(`books.title LIKE '%Heights%'`) + + let expected = UPDATE.entity({ ref: ['bookshop.Authors'] }) + + expected.UPDATE.where = [ + { list: [{ ref: ['Authors2', 'ID'] }] }, + 'in', + CQL` + (SELECT Authors.ID from bookshop.Authors as Authors + left join bookshop.Books as books on books.author_ID = Authors.ID + where books.title LIKE '%Heights%' + ) + ` + ] + expected.UPDATE.entity = { + as: 'Authors2', + ref: ['bookshop.Authors'], + } + let res = cqn4sql(u) + expect(JSON.parse(JSON.stringify(res))).to.deep.equal(JSON.parse(JSON.stringify(expected))) }) // table alias in subquery should address Books instead of bookshop.Books diff --git a/db-service/test/cqn4sql/calculated-elements.test.js b/db-service/test/cqn4sql/calculated-elements.test.js index 808fbd7a7..52bd6a0e3 100644 --- a/db-service/test/cqn4sql/calculated-elements.test.js +++ b/db-service/test/cqn4sql/calculated-elements.test.js @@ -63,6 +63,38 @@ describe('Unfolding calculated elements in select list', () => { }` expect(query).to.deep.equal(expected) }) + it('calc elem is xpr with multiple functions as args', () => { + let query = cqn4sql(CQL`SELECT from booksCalc.Books { ID, authorAgeNativePG }`, model) + const expected = CQL`SELECT from booksCalc.Books as Books + left join booksCalc.Authors as author on author.ID = Books.author_ID + { + Books.ID, + DATE_PART('year', author.dateOfDeath) - DATE_PART('year', author.dateOfBirth) as authorAgeNativePG + }` + expect(query).to.deep.equal(expected) + }) + it('calc elem is xpr with nested xpr which has multiple functions as args', () => { + let query = cqn4sql(CQL`SELECT from booksCalc.Books { ID, authorAgeInDogYears }`, model) + const expected = CQL`SELECT from booksCalc.Books as Books + left join booksCalc.Authors as author on author.ID = Books.author_ID + { + Books.ID, + ( DATE_PART('year', author.dateOfDeath) - DATE_PART('year', author.dateOfBirth) ) * 7 as authorAgeInDogYears + }` + expect(query).to.deep.equal(expected) + }) + it('calc elem is xpr with multiple functions as args - back and forth', () => { + let query = cqn4sql(CQL`SELECT from booksCalc.Books { ID, author.books.authorAgeNativePG }`, model) + const expected = CQL`SELECT from booksCalc.Books as Books + left join booksCalc.Authors as author on author.ID = Books.author_ID + left join booksCalc.Books as books2 on books2.author_ID = author.ID + left join booksCalc.Authors as author2 on author2.ID = books2.author_ID + { + Books.ID, + DATE_PART('year', author2.dateOfDeath) - DATE_PART('year', author2.dateOfBirth) as author_books_authorAgeNativePG + }` + expect(query).to.deep.equal(expected) + }) it('calc elem is function, nested in direct expression', () => { let query = cqn4sql(CQL`SELECT from booksCalc.Books { ID, ctitle || title as f }`, model) @@ -434,7 +466,10 @@ describe('Unfolding calculated elements in select list', () => { author.firstName || ' ' || author.lastName as authorFullName, (author.firstName || ' ' || author.lastName) || ' ' || (address.street || ', ' || address.city) as authorFullNameWithAddress, address.street || ', ' || address.city as authorAdrText, - years_between( author.sortCode, author.sortCode ) as authorAge + years_between( author.sortCode, author.sortCode ) as authorAge, + DATE_PART('year', author.dateOfDeath) - DATE_PART('year', author.dateOfBirth) as authorAgeNativePG, + + ( DATE_PART('year', author.dateOfDeath) - DATE_PART('year', author.dateOfBirth) ) * 7 as authorAgeInDogYears }` expect(JSON.parse(JSON.stringify(query))).to.deep.equal(expected) }) @@ -466,7 +501,10 @@ describe('Unfolding calculated elements in select list', () => { author.firstName || ' ' || author.lastName as authorFullName, (author.firstName || ' ' || author.lastName) || ' ' || (address.street || ', ' || address.city) as authorFullNameWithAddress, address.street || ', ' || address.city as authorAdrText, - years_between( author.sortCode, author.sortCode ) as authorAge + years_between( author.sortCode, author.sortCode ) as authorAge, + DATE_PART('year', author.dateOfDeath) - DATE_PART('year', author.dateOfBirth) as authorAgeNativePG, + + ( DATE_PART('year', author.dateOfDeath) - DATE_PART('year', author.dateOfBirth) ) * 7 as authorAgeInDogYears }` expect(JSON.parse(JSON.stringify(query))).to.deep.equal(expected) }) @@ -498,7 +536,10 @@ describe('Unfolding calculated elements in select list', () => { author.firstName || ' ' || author.lastName as authorFullName, (author.firstName || ' ' || author.lastName) || ' ' || (address.street || ', ' || address.city) as authorFullNameWithAddress, address.street || ', ' || address.city as authorAdrText, - years_between( author.sortCode, author.sortCode ) as authorAge + years_between( author.sortCode, author.sortCode ) as authorAge, + DATE_PART('year', author.dateOfDeath) - DATE_PART('year', author.dateOfBirth) as authorAgeNativePG, + + ( DATE_PART('year', author.dateOfDeath) - DATE_PART('year', author.dateOfBirth) ) * 7 as authorAgeInDogYears }` expect(JSON.parse(JSON.stringify(query))).to.deep.equal(expected) }) @@ -616,9 +657,9 @@ describe('Unfolding calculated elements in select list', () => { it('exists cannot leverage calculated elements w/ path expressions', () => { // at the leaf of a where exists path, there must be an association // calc elements can't end in an association, hence this does not work, yet. - expect(() => cqn4sql(CQL`SELECT from booksCalc.Books { ID } where exists author.books.youngAuthorName`, model)).to.throw( - 'Calculated elements cannot be used in “exists” predicates in: “exists author.books.youngAuthorName”', - ) + expect(() => + cqn4sql(CQL`SELECT from booksCalc.Books { ID } where exists author.books.youngAuthorName`, model), + ).to.throw('Calculated elements cannot be used in “exists” predicates in: “exists author.books.youngAuthorName”') }) it('exists cannot leverage calculated elements in CASE', () => { @@ -681,7 +722,10 @@ describe('Unfolding calculated elements in select list', () => { (author2.firstName || ' ' || author2.lastName) || ' ' || (address.street || ', ' || address.city) as authorFullNameWithAddress, address.street || ', ' || address.city as authorAdrText, - years_between( author2.sortCode, author2.sortCode ) as authorAge + years_between( author2.sortCode, author2.sortCode ) as authorAge, + DATE_PART('year', author2.dateOfDeath) - DATE_PART('year', author2.dateOfBirth) as authorAgeNativePG, + + ( DATE_PART('year', author2.dateOfDeath) - DATE_PART('year', author2.dateOfBirth) ) * 7 as authorAgeInDogYears } where Authors.ID = books.author_ID ) as books }` @@ -722,7 +766,10 @@ describe('Unfolding calculated elements in select list', () => { (author.firstName || ' ' || author.lastName) || ' ' || (address.street || ', ' || address.city) as authorFullNameWithAddress, address.street || ', ' || address.city as authorAdrText, - years_between( author.sortCode, author.sortCode ) as authorAge + years_between( author.sortCode, author.sortCode ) as authorAge, + DATE_PART('year', author.dateOfDeath) - DATE_PART('year', author.dateOfBirth) as authorAgeNativePG, + + ( DATE_PART('year', author.dateOfDeath) - DATE_PART('year', author.dateOfBirth) ) * 7 as authorAgeInDogYears } where Authors.ID = books.author_ID ) as books }` diff --git a/hana/lib/HANAService.js b/hana/lib/HANAService.js index a04417da8..0309b5d9e 100644 --- a/hana/lib/HANAService.js +++ b/hana/lib/HANAService.js @@ -144,7 +144,9 @@ class HANAService extends SQLService { }) .join(' UNION ALL ') - const ret = `DO BEGIN ${values} SELECT * FROM (${unions}) ORDER BY "_path_" ASC; END;` + const ret = temporary.length === 1 + ? `SELECT _path_ as "_path_",_blobs_ as "_blobs_",_expands_ as "_expands_",_json_ as "_json_"${blobColumns} FROM (SELECT ${temporary[0].select})` + : `DO BEGIN ${values} SELECT * FROM (${unions}) ORDER BY "_path_" ASC; END;` DEBUG?.(ret) return ret } @@ -422,7 +424,7 @@ class HANAService extends SQLService { // Making each row a maximum size of 2gb instead of the whole result set to be 2gb // Excluding binary columns as they are not supported by FOR JSON and themselves can be 2gb const rawJsonColumn = sql.length - ? `(SELECT ${sql} FROM DUMMY FOR JSON ('format'='no', 'omitnull'='no', 'arraywrap'='no') RETURNS NCLOB) AS _json_` + ? `(SELECT ${sql} FROM DUMMY FOR JSON ('format'='no', 'omitnull'='no', 'arraywrap'='no') RETURNS NVARCHAR(2147483647)) AS _json_` : `TO_NCLOB('{}') AS _json_` let jsonColumn = rawJsonColumn diff --git a/package-lock.json b/package-lock.json index 552cb30bf..eb0732ced 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "cds-dbs", - "version": "1.3.0", + "version": "1.3.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "cds-dbs", - "version": "1.3.0", + "version": "1.3.1", "license": "SEE LICENSE", "workspaces": [ "db-service", @@ -15,7 +15,7 @@ "hana" ], "devDependencies": { - "@capire/sflight": "sap-samples/cap-sflight", + "@capire/sflight": "github:sap-samples/cap-sflight", "@sap/hana-client": "^2.16.26", "axios": "^1", "chai": "^4.3.7", @@ -29,7 +29,7 @@ }, "db-service": { "name": "@cap-js/db-service", - "version": "1.3.0", + "version": "1.3.2", "license": "SEE LICENSE", "devDependencies": { "@typescript-eslint/eslint-plugin": "^6.2.0", @@ -745,7 +745,7 @@ }, "node_modules/@capire/sflight": { "version": "1.0.0", - "resolved": "git+ssh://git@github.com/sap-samples/cap-sflight.git#43b3ef6da0d1fb8168f20314b90cf30128e9daa3", + "resolved": "git+ssh://git@github.com/sap-samples/cap-sflight.git#21d9126433c3d0dd3390a67f6446f82016f58121", "dev": true, "license": "SAP SAMPLE CODE LICENSE", "dependencies": { @@ -1355,6 +1355,7 @@ "resolved": "https://registry.npmjs.org/@sap/cds-dk/-/cds-dk-7.2.0.tgz", "integrity": "sha512-SBGvffahcnvndPfnIb+uuTVTe9vuPMaX5Ytz6SD7P/dsqBXVjXFk7SHME/tSsSNzXRyopbbVBg6CiLW3L5WIEA==", "hasShrinkwrap": true, + "optional": true, "peer": true, "dependencies": { "@sap/cds": "^7", @@ -1383,6 +1384,7 @@ "node_modules/@sap/cds-dk/node_modules/@aashutoshrathi/word-wrap": { "version": "1.2.6", "license": "MIT", + "optional": true, "peer": true, "engines": { "node": ">=0.10.0" @@ -1391,6 +1393,7 @@ "node_modules/@sap/cds-dk/node_modules/@eslint-community/eslint-utils": { "version": "4.4.0", "license": "MIT", + "optional": true, "peer": true, "dependencies": { "eslint-visitor-keys": "^3.3.0" @@ -1405,6 +1408,7 @@ "node_modules/@sap/cds-dk/node_modules/@eslint-community/regexpp": { "version": "4.8.0", "license": "MIT", + "optional": true, "peer": true, "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" @@ -1413,6 +1417,7 @@ "node_modules/@sap/cds-dk/node_modules/@eslint/eslintrc": { "version": "2.1.2", "license": "MIT", + "optional": true, "peer": true, "dependencies": { "ajv": "^6.12.4", @@ -1435,6 +1440,7 @@ "node_modules/@sap/cds-dk/node_modules/@eslint/eslintrc/node_modules/debug": { "version": "4.3.4", "license": "MIT", + "optional": true, "peer": true, "dependencies": { "ms": "2.1.2" @@ -1451,11 +1457,13 @@ "node_modules/@sap/cds-dk/node_modules/@eslint/eslintrc/node_modules/ms": { "version": "2.1.2", "license": "MIT", + "optional": true, "peer": true }, "node_modules/@sap/cds-dk/node_modules/@eslint/js": { "version": "8.48.0", "license": "MIT", + "optional": true, "peer": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -1470,6 +1478,7 @@ "node_modules/@sap/cds-dk/node_modules/@humanwhocodes/config-array": { "version": "0.11.11", "license": "Apache-2.0", + "optional": true, "peer": true, "dependencies": { "@humanwhocodes/object-schema": "^1.2.1", @@ -1483,6 +1492,7 @@ "node_modules/@sap/cds-dk/node_modules/@humanwhocodes/config-array/node_modules/debug": { "version": "4.3.4", "license": "MIT", + "optional": true, "peer": true, "dependencies": { "ms": "2.1.2" @@ -1499,11 +1509,13 @@ "node_modules/@sap/cds-dk/node_modules/@humanwhocodes/config-array/node_modules/ms": { "version": "2.1.2", "license": "MIT", + "optional": true, "peer": true }, "node_modules/@sap/cds-dk/node_modules/@humanwhocodes/module-importer": { "version": "1.0.1", "license": "Apache-2.0", + "optional": true, "peer": true, "engines": { "node": ">=12.22" @@ -1516,6 +1528,7 @@ "node_modules/@sap/cds-dk/node_modules/@humanwhocodes/object-schema": { "version": "1.2.1", "license": "BSD-3-Clause", + "optional": true, "peer": true }, "node_modules/@sap/cds-dk/node_modules/@mapbox/node-pre-gyp": { @@ -1565,6 +1578,7 @@ "node_modules/@sap/cds-dk/node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "license": "MIT", + "optional": true, "peer": true, "dependencies": { "@nodelib/fs.stat": "2.0.5", @@ -1577,6 +1591,7 @@ "node_modules/@sap/cds-dk/node_modules/@nodelib/fs.stat": { "version": "2.0.5", "license": "MIT", + "optional": true, "peer": true, "engines": { "node": ">= 8" @@ -1585,6 +1600,7 @@ "node_modules/@sap/cds-dk/node_modules/@nodelib/fs.walk": { "version": "1.2.8", "license": "MIT", + "optional": true, "peer": true, "dependencies": { "@nodelib/fs.scandir": "2.1.5", @@ -1620,6 +1636,7 @@ "node_modules/@sap/cds-dk/node_modules/@sap/cds": { "version": "7.2.0", "license": "SEE LICENSE IN LICENSE", + "optional": true, "peer": true, "dependencies": { "@sap/cds-compiler": "^4", @@ -1637,6 +1654,7 @@ "node_modules/@sap/cds-dk/node_modules/@sap/cds-compiler": { "version": "4.2.2", "license": "SEE LICENSE IN LICENSE", + "optional": true, "peer": true, "dependencies": { "antlr4": "4.9.3" @@ -1653,6 +1671,7 @@ "node_modules/@sap/cds-dk/node_modules/@sap/cds-fiori": { "version": "1.1.0", "license": "SEE LICENSE IN LICENSE", + "optional": true, "peer": true, "peerDependencies": { "@sap/cds": ">=7", @@ -1662,6 +1681,7 @@ "node_modules/@sap/cds-dk/node_modules/@sap/cds-foss": { "version": "4.0.2", "license": "See LICENSE in LICENSE", + "optional": true, "peer": true, "dependencies": { "big.js": "^6.1.1", @@ -1677,6 +1697,7 @@ "node_modules/@sap/cds-dk/node_modules/@sap/cds-mtxs": { "version": "1.11.0", "license": "SEE LICENSE IN LICENSE", + "optional": true, "peer": true, "dependencies": { "@sap/hdi-deploy": "^4", @@ -1690,6 +1711,7 @@ "node_modules/@sap/cds-dk/node_modules/@sap/eslint-plugin-cds": { "version": "2.6.3", "license": "See LICENSE file", + "optional": true, "peer": true, "dependencies": { "@sap/cds": ">=5.6.0", @@ -1706,6 +1728,7 @@ "version": "2.17.22", "hasInstallScript": true, "license": "SEE LICENSE IN developer-license-3_1.txt", + "optional": true, "peer": true, "dependencies": { "debug": "3.1.0" @@ -1717,6 +1740,7 @@ "node_modules/@sap/cds-dk/node_modules/@sap/hdi": { "version": "4.5.0", "license": "See LICENSE file", + "optional": true, "peer": true, "dependencies": { "async": "3.2.3" @@ -1740,6 +1764,7 @@ "node_modules/@sap/cds-dk/node_modules/@sap/hdi-deploy": { "version": "4.8.0", "license": "See LICENSE file", + "optional": true, "peer": true, "dependencies": { "@sap/hana-client": "2.17.22", @@ -1758,6 +1783,7 @@ "node_modules/@sap/cds-dk/node_modules/@sap/xsenv": { "version": "3.4.0", "license": "SEE LICENSE IN LICENSE file", + "optional": true, "peer": true, "dependencies": { "debug": "4.3.3", @@ -1771,6 +1797,7 @@ "node_modules/@sap/cds-dk/node_modules/@sap/xsenv/node_modules/debug": { "version": "4.3.3", "license": "MIT", + "optional": true, "peer": true, "dependencies": { "ms": "2.1.2" @@ -1787,6 +1814,7 @@ "node_modules/@sap/cds-dk/node_modules/@sap/xsenv/node_modules/ms": { "version": "2.1.2", "license": "MIT", + "optional": true, "peer": true }, "node_modules/@sap/cds-dk/node_modules/@tootallnate/once": { @@ -1807,6 +1835,7 @@ "node_modules/@sap/cds-dk/node_modules/accepts": { "version": "1.3.8", "license": "MIT", + "optional": true, "peer": true, "dependencies": { "mime-types": "~2.1.34", @@ -1819,6 +1848,7 @@ "node_modules/@sap/cds-dk/node_modules/acorn": { "version": "8.10.0", "license": "MIT", + "optional": true, "peer": true, "bin": { "acorn": "bin/acorn" @@ -1830,6 +1860,7 @@ "node_modules/@sap/cds-dk/node_modules/acorn-jsx": { "version": "5.3.2", "license": "MIT", + "optional": true, "peer": true, "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" @@ -1898,6 +1929,7 @@ "node_modules/@sap/cds-dk/node_modules/ajv": { "version": "6.12.6", "license": "MIT", + "optional": true, "peer": true, "dependencies": { "fast-deep-equal": "^3.1.1", @@ -1913,6 +1945,7 @@ "node_modules/@sap/cds-dk/node_modules/ansi-regex": { "version": "5.0.1", "license": "MIT", + "optional": true, "peer": true, "engines": { "node": ">=8" @@ -1921,6 +1954,7 @@ "node_modules/@sap/cds-dk/node_modules/ansi-styles": { "version": "4.3.0", "license": "MIT", + "optional": true, "peer": true, "dependencies": { "color-convert": "^2.0.1" @@ -1935,6 +1969,7 @@ "node_modules/@sap/cds-dk/node_modules/antlr4": { "version": "4.9.3", "license": "BSD-3-Clause", + "optional": true, "peer": true, "engines": { "node": ">=14" @@ -1962,16 +1997,19 @@ "node_modules/@sap/cds-dk/node_modules/argparse": { "version": "2.0.1", "license": "Python-2.0", + "optional": true, "peer": true }, "node_modules/@sap/cds-dk/node_modules/array-flatten": { "version": "1.1.1", "license": "MIT", + "optional": true, "peer": true }, "node_modules/@sap/cds-dk/node_modules/assert-plus": { "version": "1.0.0", "license": "MIT", + "optional": true, "peer": true, "engines": { "node": ">=0.8" @@ -1980,16 +2018,19 @@ "node_modules/@sap/cds-dk/node_modules/async": { "version": "3.2.3", "license": "MIT", + "optional": true, "peer": true }, "node_modules/@sap/cds-dk/node_modules/asynckit": { "version": "0.4.0", "license": "MIT", + "optional": true, "peer": true }, "node_modules/@sap/cds-dk/node_modules/axios": { "version": "1.5.0", "license": "MIT", + "optional": true, "peer": true, "dependencies": { "follow-redirects": "^1.15.0", @@ -2000,11 +2041,13 @@ "node_modules/@sap/cds-dk/node_modules/balanced-match": { "version": "1.0.2", "license": "MIT", + "optional": true, "peer": true }, "node_modules/@sap/cds-dk/node_modules/big.js": { "version": "6.2.1", "license": "MIT", + "optional": true, "peer": true, "engines": { "node": "*" @@ -2017,6 +2060,7 @@ "node_modules/@sap/cds-dk/node_modules/body-parser": { "version": "1.20.1", "license": "MIT", + "optional": true, "peer": true, "dependencies": { "bytes": "3.1.2", @@ -2040,6 +2084,7 @@ "node_modules/@sap/cds-dk/node_modules/body-parser/node_modules/debug": { "version": "2.6.9", "license": "MIT", + "optional": true, "peer": true, "dependencies": { "ms": "2.0.0" @@ -2048,6 +2093,7 @@ "node_modules/@sap/cds-dk/node_modules/brace-expansion": { "version": "1.1.11", "license": "MIT", + "optional": true, "peer": true, "dependencies": { "balanced-match": "^1.0.0", @@ -2057,6 +2103,7 @@ "node_modules/@sap/cds-dk/node_modules/braces": { "version": "3.0.2", "license": "MIT", + "optional": true, "peer": true, "dependencies": { "fill-range": "^7.0.1" @@ -2068,6 +2115,7 @@ "node_modules/@sap/cds-dk/node_modules/bytes": { "version": "3.1.2", "license": "MIT", + "optional": true, "peer": true, "engines": { "node": ">= 0.8" @@ -2123,6 +2171,7 @@ "node_modules/@sap/cds-dk/node_modules/call-bind": { "version": "1.0.2", "license": "MIT", + "optional": true, "peer": true, "dependencies": { "function-bind": "^1.1.1", @@ -2135,6 +2184,7 @@ "node_modules/@sap/cds-dk/node_modules/callsites": { "version": "3.1.0", "license": "MIT", + "optional": true, "peer": true, "engines": { "node": ">=6" @@ -2143,6 +2193,7 @@ "node_modules/@sap/cds-dk/node_modules/chalk": { "version": "4.1.2", "license": "MIT", + "optional": true, "peer": true, "dependencies": { "ansi-styles": "^4.1.0", @@ -2176,6 +2227,7 @@ "node_modules/@sap/cds-dk/node_modules/clone": { "version": "2.1.2", "license": "MIT", + "optional": true, "peer": true, "engines": { "node": ">=0.8" @@ -2184,6 +2236,7 @@ "node_modules/@sap/cds-dk/node_modules/color-convert": { "version": "2.0.1", "license": "MIT", + "optional": true, "peer": true, "dependencies": { "color-name": "~1.1.4" @@ -2195,6 +2248,7 @@ "node_modules/@sap/cds-dk/node_modules/color-name": { "version": "1.1.4", "license": "MIT", + "optional": true, "peer": true }, "node_modules/@sap/cds-dk/node_modules/color-support": { @@ -2209,6 +2263,7 @@ "node_modules/@sap/cds-dk/node_modules/combined-stream": { "version": "1.0.8", "license": "MIT", + "optional": true, "peer": true, "dependencies": { "delayed-stream": "~1.0.0" @@ -2220,6 +2275,7 @@ "node_modules/@sap/cds-dk/node_modules/concat-map": { "version": "0.0.1", "license": "MIT", + "optional": true, "peer": true }, "node_modules/@sap/cds-dk/node_modules/console-control-strings": { @@ -2231,6 +2287,7 @@ "node_modules/@sap/cds-dk/node_modules/content-disposition": { "version": "0.5.4", "license": "MIT", + "optional": true, "peer": true, "dependencies": { "safe-buffer": "5.2.1" @@ -2242,6 +2299,7 @@ "node_modules/@sap/cds-dk/node_modules/content-type": { "version": "1.0.5", "license": "MIT", + "optional": true, "peer": true, "engines": { "node": ">= 0.6" @@ -2250,6 +2308,7 @@ "node_modules/@sap/cds-dk/node_modules/cookie": { "version": "0.5.0", "license": "MIT", + "optional": true, "peer": true, "engines": { "node": ">= 0.6" @@ -2258,16 +2317,19 @@ "node_modules/@sap/cds-dk/node_modules/cookie-signature": { "version": "1.0.6", "license": "MIT", + "optional": true, "peer": true }, "node_modules/@sap/cds-dk/node_modules/core-util-is": { "version": "1.0.2", "license": "MIT", + "optional": true, "peer": true }, "node_modules/@sap/cds-dk/node_modules/cross-spawn": { "version": "7.0.3", "license": "MIT", + "optional": true, "peer": true, "dependencies": { "path-key": "^3.1.0", @@ -2281,6 +2343,7 @@ "node_modules/@sap/cds-dk/node_modules/debug": { "version": "3.1.0", "license": "MIT", + "optional": true, "peer": true, "dependencies": { "ms": "2.0.0" @@ -2289,11 +2352,13 @@ "node_modules/@sap/cds-dk/node_modules/deep-is": { "version": "0.1.4", "license": "MIT", + "optional": true, "peer": true }, "node_modules/@sap/cds-dk/node_modules/delayed-stream": { "version": "1.0.0", "license": "MIT", + "optional": true, "peer": true, "engines": { "node": ">=0.4.0" @@ -2308,6 +2373,7 @@ "node_modules/@sap/cds-dk/node_modules/depd": { "version": "2.0.0", "license": "MIT", + "optional": true, "peer": true, "engines": { "node": ">= 0.8" @@ -2316,6 +2382,7 @@ "node_modules/@sap/cds-dk/node_modules/destroy": { "version": "1.2.0", "license": "MIT", + "optional": true, "peer": true, "engines": { "node": ">= 0.8", @@ -2334,6 +2401,7 @@ "node_modules/@sap/cds-dk/node_modules/doctrine": { "version": "3.0.0", "license": "Apache-2.0", + "optional": true, "peer": true, "dependencies": { "esutils": "^2.0.2" @@ -2345,6 +2413,7 @@ "node_modules/@sap/cds-dk/node_modules/dotenv": { "version": "10.0.0", "license": "BSD-2-Clause", + "optional": true, "peer": true, "engines": { "node": ">=10" @@ -2353,6 +2422,7 @@ "node_modules/@sap/cds-dk/node_modules/ee-first": { "version": "1.1.1", "license": "MIT", + "optional": true, "peer": true }, "node_modules/@sap/cds-dk/node_modules/emoji-regex": { @@ -2364,6 +2434,7 @@ "node_modules/@sap/cds-dk/node_modules/encodeurl": { "version": "1.0.2", "license": "MIT", + "optional": true, "peer": true, "engines": { "node": ">= 0.8" @@ -2408,11 +2479,13 @@ "node_modules/@sap/cds-dk/node_modules/escape-html": { "version": "1.0.3", "license": "MIT", + "optional": true, "peer": true }, "node_modules/@sap/cds-dk/node_modules/escape-string-regexp": { "version": "4.0.0", "license": "MIT", + "optional": true, "peer": true, "engines": { "node": ">=10" @@ -2424,6 +2497,7 @@ "node_modules/@sap/cds-dk/node_modules/eslint": { "version": "8.48.0", "license": "MIT", + "optional": true, "peer": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", @@ -2477,6 +2551,7 @@ "node_modules/@sap/cds-dk/node_modules/eslint-scope": { "version": "7.2.2", "license": "BSD-2-Clause", + "optional": true, "peer": true, "dependencies": { "esrecurse": "^4.3.0", @@ -2492,6 +2567,7 @@ "node_modules/@sap/cds-dk/node_modules/eslint-visitor-keys": { "version": "3.4.3", "license": "Apache-2.0", + "optional": true, "peer": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -2503,6 +2579,7 @@ "node_modules/@sap/cds-dk/node_modules/eslint/node_modules/debug": { "version": "4.3.4", "license": "MIT", + "optional": true, "peer": true, "dependencies": { "ms": "2.1.2" @@ -2519,11 +2596,13 @@ "node_modules/@sap/cds-dk/node_modules/eslint/node_modules/ms": { "version": "2.1.2", "license": "MIT", + "optional": true, "peer": true }, "node_modules/@sap/cds-dk/node_modules/espree": { "version": "9.6.1", "license": "BSD-2-Clause", + "optional": true, "peer": true, "dependencies": { "acorn": "^8.9.0", @@ -2540,6 +2619,7 @@ "node_modules/@sap/cds-dk/node_modules/esquery": { "version": "1.5.0", "license": "BSD-3-Clause", + "optional": true, "peer": true, "dependencies": { "estraverse": "^5.1.0" @@ -2551,6 +2631,7 @@ "node_modules/@sap/cds-dk/node_modules/esrecurse": { "version": "4.3.0", "license": "BSD-2-Clause", + "optional": true, "peer": true, "dependencies": { "estraverse": "^5.2.0" @@ -2562,6 +2643,7 @@ "node_modules/@sap/cds-dk/node_modules/estraverse": { "version": "5.3.0", "license": "BSD-2-Clause", + "optional": true, "peer": true, "engines": { "node": ">=4.0" @@ -2570,6 +2652,7 @@ "node_modules/@sap/cds-dk/node_modules/esutils": { "version": "2.0.3", "license": "BSD-2-Clause", + "optional": true, "peer": true, "engines": { "node": ">=0.10.0" @@ -2578,6 +2661,7 @@ "node_modules/@sap/cds-dk/node_modules/etag": { "version": "1.8.1", "license": "MIT", + "optional": true, "peer": true, "engines": { "node": ">= 0.6" @@ -2586,6 +2670,7 @@ "node_modules/@sap/cds-dk/node_modules/express": { "version": "4.18.2", "license": "MIT", + "optional": true, "peer": true, "dependencies": { "accepts": "~1.3.8", @@ -2627,6 +2712,7 @@ "node_modules/@sap/cds-dk/node_modules/express/node_modules/debug": { "version": "2.6.9", "license": "MIT", + "optional": true, "peer": true, "dependencies": { "ms": "2.0.0" @@ -2638,26 +2724,31 @@ "node >=0.6.0" ], "license": "MIT", + "optional": true, "peer": true }, "node_modules/@sap/cds-dk/node_modules/fast-deep-equal": { "version": "3.1.3", "license": "MIT", + "optional": true, "peer": true }, "node_modules/@sap/cds-dk/node_modules/fast-json-stable-stringify": { "version": "2.1.0", "license": "MIT", + "optional": true, "peer": true }, "node_modules/@sap/cds-dk/node_modules/fast-levenshtein": { "version": "2.0.6", "license": "MIT", + "optional": true, "peer": true }, "node_modules/@sap/cds-dk/node_modules/fastq": { "version": "1.15.0", "license": "ISC", + "optional": true, "peer": true, "dependencies": { "reusify": "^1.0.4" @@ -2666,6 +2757,7 @@ "node_modules/@sap/cds-dk/node_modules/file-entry-cache": { "version": "6.0.1", "license": "MIT", + "optional": true, "peer": true, "dependencies": { "flat-cache": "^3.0.4" @@ -2677,6 +2769,7 @@ "node_modules/@sap/cds-dk/node_modules/fill-range": { "version": "7.0.1", "license": "MIT", + "optional": true, "peer": true, "dependencies": { "to-regex-range": "^5.0.1" @@ -2688,6 +2781,7 @@ "node_modules/@sap/cds-dk/node_modules/finalhandler": { "version": "1.2.0", "license": "MIT", + "optional": true, "peer": true, "dependencies": { "debug": "2.6.9", @@ -2705,6 +2799,7 @@ "node_modules/@sap/cds-dk/node_modules/finalhandler/node_modules/debug": { "version": "2.6.9", "license": "MIT", + "optional": true, "peer": true, "dependencies": { "ms": "2.0.0" @@ -2713,6 +2808,7 @@ "node_modules/@sap/cds-dk/node_modules/find-up": { "version": "5.0.0", "license": "MIT", + "optional": true, "peer": true, "dependencies": { "locate-path": "^6.0.0", @@ -2728,6 +2824,7 @@ "node_modules/@sap/cds-dk/node_modules/flat-cache": { "version": "3.1.0", "license": "MIT", + "optional": true, "peer": true, "dependencies": { "flatted": "^3.2.7", @@ -2741,6 +2838,7 @@ "node_modules/@sap/cds-dk/node_modules/flatted": { "version": "3.2.7", "license": "ISC", + "optional": true, "peer": true }, "node_modules/@sap/cds-dk/node_modules/follow-redirects": { @@ -2752,6 +2850,7 @@ } ], "license": "MIT", + "optional": true, "peer": true, "engines": { "node": ">=4.0" @@ -2765,6 +2864,7 @@ "node_modules/@sap/cds-dk/node_modules/form-data": { "version": "4.0.0", "license": "MIT", + "optional": true, "peer": true, "dependencies": { "asynckit": "^0.4.0", @@ -2778,6 +2878,7 @@ "node_modules/@sap/cds-dk/node_modules/forwarded": { "version": "0.2.0", "license": "MIT", + "optional": true, "peer": true, "engines": { "node": ">= 0.6" @@ -2786,6 +2887,7 @@ "node_modules/@sap/cds-dk/node_modules/fresh": { "version": "0.5.2", "license": "MIT", + "optional": true, "peer": true, "engines": { "node": ">= 0.6" @@ -2806,11 +2908,13 @@ "node_modules/@sap/cds-dk/node_modules/fs.realpath": { "version": "1.0.0", "license": "ISC", + "optional": true, "peer": true }, "node_modules/@sap/cds-dk/node_modules/function-bind": { "version": "1.1.1", "license": "MIT", + "optional": true, "peer": true }, "node_modules/@sap/cds-dk/node_modules/gauge": { @@ -2836,6 +2940,7 @@ "node_modules/@sap/cds-dk/node_modules/generic-pool": { "version": "3.9.0", "license": "MIT", + "optional": true, "peer": true, "engines": { "node": ">= 4" @@ -2844,6 +2949,7 @@ "node_modules/@sap/cds-dk/node_modules/get-intrinsic": { "version": "1.2.1", "license": "MIT", + "optional": true, "peer": true, "dependencies": { "function-bind": "^1.1.1", @@ -2858,6 +2964,7 @@ "node_modules/@sap/cds-dk/node_modules/glob": { "version": "7.2.3", "license": "ISC", + "optional": true, "peer": true, "dependencies": { "fs.realpath": "^1.0.0", @@ -2877,6 +2984,7 @@ "node_modules/@sap/cds-dk/node_modules/glob-parent": { "version": "6.0.2", "license": "ISC", + "optional": true, "peer": true, "dependencies": { "is-glob": "^4.0.3" @@ -2888,6 +2996,7 @@ "node_modules/@sap/cds-dk/node_modules/globals": { "version": "13.21.0", "license": "MIT", + "optional": true, "peer": true, "dependencies": { "type-fest": "^0.20.2" @@ -2908,11 +3017,13 @@ "node_modules/@sap/cds-dk/node_modules/graphemer": { "version": "1.4.0", "license": "MIT", + "optional": true, "peer": true }, "node_modules/@sap/cds-dk/node_modules/handlebars": { "version": "4.7.7", "license": "MIT", + "optional": true, "peer": true, "dependencies": { "minimist": "^1.2.5", @@ -2933,6 +3044,7 @@ "node_modules/@sap/cds-dk/node_modules/has": { "version": "1.0.3", "license": "MIT", + "optional": true, "peer": true, "dependencies": { "function-bind": "^1.1.1" @@ -2944,6 +3056,7 @@ "node_modules/@sap/cds-dk/node_modules/has-flag": { "version": "4.0.0", "license": "MIT", + "optional": true, "peer": true, "engines": { "node": ">=8" @@ -2952,6 +3065,7 @@ "node_modules/@sap/cds-dk/node_modules/has-proto": { "version": "1.0.1", "license": "MIT", + "optional": true, "peer": true, "engines": { "node": ">= 0.4" @@ -2963,6 +3077,7 @@ "node_modules/@sap/cds-dk/node_modules/has-symbols": { "version": "1.0.3", "license": "MIT", + "optional": true, "peer": true, "engines": { "node": ">= 0.4" @@ -2980,6 +3095,7 @@ "node_modules/@sap/cds-dk/node_modules/hdb": { "version": "0.19.3", "license": "Apache-2.0", + "optional": true, "peer": true, "dependencies": { "iconv-lite": "^0.4.18" @@ -2997,6 +3113,7 @@ "node_modules/@sap/cds-dk/node_modules/http-errors": { "version": "2.0.0", "license": "MIT", + "optional": true, "peer": true, "dependencies": { "depd": "2.0.0", @@ -3094,6 +3211,7 @@ "node_modules/@sap/cds-dk/node_modules/iconv-lite": { "version": "0.4.24", "license": "MIT", + "optional": true, "peer": true, "dependencies": { "safer-buffer": ">= 2.1.2 < 3" @@ -3105,6 +3223,7 @@ "node_modules/@sap/cds-dk/node_modules/ignore": { "version": "5.2.4", "license": "MIT", + "optional": true, "peer": true, "engines": { "node": ">= 4" @@ -3113,6 +3232,7 @@ "node_modules/@sap/cds-dk/node_modules/import-fresh": { "version": "3.3.0", "license": "MIT", + "optional": true, "peer": true, "dependencies": { "parent-module": "^1.0.0", @@ -3128,6 +3248,7 @@ "node_modules/@sap/cds-dk/node_modules/imurmurhash": { "version": "0.1.4", "license": "MIT", + "optional": true, "peer": true, "engines": { "node": ">=0.8.19" @@ -3151,6 +3272,7 @@ "node_modules/@sap/cds-dk/node_modules/inflight": { "version": "1.0.6", "license": "ISC", + "optional": true, "peer": true, "dependencies": { "once": "^1.3.0", @@ -3160,6 +3282,7 @@ "node_modules/@sap/cds-dk/node_modules/inherits": { "version": "2.0.4", "license": "ISC", + "optional": true, "peer": true }, "node_modules/@sap/cds-dk/node_modules/ip": { @@ -3171,6 +3294,7 @@ "node_modules/@sap/cds-dk/node_modules/ipaddr.js": { "version": "1.9.1", "license": "MIT", + "optional": true, "peer": true, "engines": { "node": ">= 0.10" @@ -3179,6 +3303,7 @@ "node_modules/@sap/cds-dk/node_modules/is-extglob": { "version": "2.1.1", "license": "MIT", + "optional": true, "peer": true, "engines": { "node": ">=0.10.0" @@ -3196,6 +3321,7 @@ "node_modules/@sap/cds-dk/node_modules/is-glob": { "version": "4.0.3", "license": "MIT", + "optional": true, "peer": true, "dependencies": { "is-extglob": "^2.1.1" @@ -3213,6 +3339,7 @@ "node_modules/@sap/cds-dk/node_modules/is-number": { "version": "7.0.0", "license": "MIT", + "optional": true, "peer": true, "engines": { "node": ">=0.12.0" @@ -3221,6 +3348,7 @@ "node_modules/@sap/cds-dk/node_modules/is-path-inside": { "version": "3.0.3", "license": "MIT", + "optional": true, "peer": true, "engines": { "node": ">=8" @@ -3229,11 +3357,13 @@ "node_modules/@sap/cds-dk/node_modules/isexe": { "version": "2.0.0", "license": "ISC", + "optional": true, "peer": true }, "node_modules/@sap/cds-dk/node_modules/js-yaml": { "version": "4.1.0", "license": "MIT", + "optional": true, "peer": true, "dependencies": { "argparse": "^2.0.1" @@ -3245,21 +3375,25 @@ "node_modules/@sap/cds-dk/node_modules/json-buffer": { "version": "3.0.1", "license": "MIT", + "optional": true, "peer": true }, "node_modules/@sap/cds-dk/node_modules/json-schema-traverse": { "version": "0.4.1", "license": "MIT", + "optional": true, "peer": true }, "node_modules/@sap/cds-dk/node_modules/json-stable-stringify-without-jsonify": { "version": "1.0.1", "license": "MIT", + "optional": true, "peer": true }, "node_modules/@sap/cds-dk/node_modules/keyv": { "version": "4.5.3", "license": "MIT", + "optional": true, "peer": true, "dependencies": { "json-buffer": "3.0.1" @@ -3268,6 +3402,7 @@ "node_modules/@sap/cds-dk/node_modules/levn": { "version": "0.4.1", "license": "MIT", + "optional": true, "peer": true, "dependencies": { "prelude-ls": "^1.2.1", @@ -3280,11 +3415,13 @@ "node_modules/@sap/cds-dk/node_modules/livereload-js": { "version": "4.0.1", "license": "MIT", + "optional": true, "peer": true }, "node_modules/@sap/cds-dk/node_modules/locate-path": { "version": "6.0.0", "license": "MIT", + "optional": true, "peer": true, "dependencies": { "p-locate": "^5.0.0" @@ -3299,6 +3436,7 @@ "node_modules/@sap/cds-dk/node_modules/lodash.merge": { "version": "4.6.2", "license": "MIT", + "optional": true, "peer": true }, "node_modules/@sap/cds-dk/node_modules/make-fetch-happen": { @@ -3349,6 +3487,7 @@ "node_modules/@sap/cds-dk/node_modules/media-typer": { "version": "0.3.0", "license": "MIT", + "optional": true, "peer": true, "engines": { "node": ">= 0.6" @@ -3357,11 +3496,13 @@ "node_modules/@sap/cds-dk/node_modules/merge-descriptors": { "version": "1.0.1", "license": "MIT", + "optional": true, "peer": true }, "node_modules/@sap/cds-dk/node_modules/methods": { "version": "1.1.2", "license": "MIT", + "optional": true, "peer": true, "engines": { "node": ">= 0.6" @@ -3370,6 +3511,7 @@ "node_modules/@sap/cds-dk/node_modules/micromatch": { "version": "4.0.4", "license": "MIT", + "optional": true, "peer": true, "dependencies": { "braces": "^3.0.1", @@ -3382,6 +3524,7 @@ "node_modules/@sap/cds-dk/node_modules/mime": { "version": "1.6.0", "license": "MIT", + "optional": true, "peer": true, "bin": { "mime": "cli.js" @@ -3393,6 +3536,7 @@ "node_modules/@sap/cds-dk/node_modules/mime-db": { "version": "1.52.0", "license": "MIT", + "optional": true, "peer": true, "engines": { "node": ">= 0.6" @@ -3401,6 +3545,7 @@ "node_modules/@sap/cds-dk/node_modules/mime-types": { "version": "2.1.35", "license": "MIT", + "optional": true, "peer": true, "dependencies": { "mime-db": "1.52.0" @@ -3412,6 +3557,7 @@ "node_modules/@sap/cds-dk/node_modules/minimatch": { "version": "3.1.2", "license": "ISC", + "optional": true, "peer": true, "dependencies": { "brace-expansion": "^1.1.7" @@ -3423,6 +3569,7 @@ "node_modules/@sap/cds-dk/node_modules/minimist": { "version": "1.2.8", "license": "MIT", + "optional": true, "peer": true, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -3545,11 +3692,13 @@ "node_modules/@sap/cds-dk/node_modules/ms": { "version": "2.0.0", "license": "MIT", + "optional": true, "peer": true }, "node_modules/@sap/cds-dk/node_modules/mustache": { "version": "4.2.0", "license": "MIT", + "optional": true, "peer": true, "bin": { "mustache": "bin/mustache" @@ -3558,11 +3707,13 @@ "node_modules/@sap/cds-dk/node_modules/natural-compare": { "version": "1.4.0", "license": "MIT", + "optional": true, "peer": true }, "node_modules/@sap/cds-dk/node_modules/negotiator": { "version": "0.6.3", "license": "MIT", + "optional": true, "peer": true, "engines": { "node": ">= 0.6" @@ -3571,6 +3722,7 @@ "node_modules/@sap/cds-dk/node_modules/neo-async": { "version": "2.6.2", "license": "MIT", + "optional": true, "peer": true }, "node_modules/@sap/cds-dk/node_modules/node-addon-api": { @@ -3582,6 +3734,7 @@ "node_modules/@sap/cds-dk/node_modules/node-cache": { "version": "5.1.2", "license": "MIT", + "optional": true, "peer": true, "dependencies": { "clone": "2.x" @@ -3684,6 +3837,7 @@ "node_modules/@sap/cds-dk/node_modules/node-watch": { "version": "0.7.4", "license": "MIT", + "optional": true, "peer": true, "engines": { "node": ">=6" @@ -3728,6 +3882,7 @@ "node_modules/@sap/cds-dk/node_modules/object-inspect": { "version": "1.12.3", "license": "MIT", + "optional": true, "peer": true, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -3736,6 +3891,7 @@ "node_modules/@sap/cds-dk/node_modules/on-finished": { "version": "2.4.1", "license": "MIT", + "optional": true, "peer": true, "dependencies": { "ee-first": "1.1.1" @@ -3747,6 +3903,7 @@ "node_modules/@sap/cds-dk/node_modules/once": { "version": "1.4.0", "license": "ISC", + "optional": true, "peer": true, "dependencies": { "wrappy": "1" @@ -3755,6 +3912,7 @@ "node_modules/@sap/cds-dk/node_modules/optionator": { "version": "0.9.3", "license": "MIT", + "optional": true, "peer": true, "dependencies": { "@aashutoshrathi/word-wrap": "^1.2.3", @@ -3771,6 +3929,7 @@ "node_modules/@sap/cds-dk/node_modules/p-limit": { "version": "3.1.0", "license": "MIT", + "optional": true, "peer": true, "dependencies": { "yocto-queue": "^0.1.0" @@ -3785,6 +3944,7 @@ "node_modules/@sap/cds-dk/node_modules/p-locate": { "version": "5.0.0", "license": "MIT", + "optional": true, "peer": true, "dependencies": { "p-limit": "^3.0.2" @@ -3814,6 +3974,7 @@ "node_modules/@sap/cds-dk/node_modules/parent-module": { "version": "1.0.1", "license": "MIT", + "optional": true, "peer": true, "dependencies": { "callsites": "^3.0.0" @@ -3825,6 +3986,7 @@ "node_modules/@sap/cds-dk/node_modules/parseurl": { "version": "1.3.3", "license": "MIT", + "optional": true, "peer": true, "engines": { "node": ">= 0.8" @@ -3833,6 +3995,7 @@ "node_modules/@sap/cds-dk/node_modules/path-exists": { "version": "4.0.0", "license": "MIT", + "optional": true, "peer": true, "engines": { "node": ">=8" @@ -3841,6 +4004,7 @@ "node_modules/@sap/cds-dk/node_modules/path-is-absolute": { "version": "1.0.1", "license": "MIT", + "optional": true, "peer": true, "engines": { "node": ">=0.10.0" @@ -3849,6 +4013,7 @@ "node_modules/@sap/cds-dk/node_modules/path-key": { "version": "3.1.1", "license": "MIT", + "optional": true, "peer": true, "engines": { "node": ">=8" @@ -3857,11 +4022,13 @@ "node_modules/@sap/cds-dk/node_modules/path-to-regexp": { "version": "0.1.7", "license": "MIT", + "optional": true, "peer": true }, "node_modules/@sap/cds-dk/node_modules/picomatch": { "version": "2.3.1", "license": "MIT", + "optional": true, "peer": true, "engines": { "node": ">=8.6" @@ -3873,6 +4040,7 @@ "node_modules/@sap/cds-dk/node_modules/pluralize": { "version": "8.0.0", "license": "MIT", + "optional": true, "peer": true, "engines": { "node": ">=4" @@ -3881,6 +4049,7 @@ "node_modules/@sap/cds-dk/node_modules/prelude-ls": { "version": "1.2.1", "license": "MIT", + "optional": true, "peer": true, "engines": { "node": ">= 0.8.0" @@ -3908,6 +4077,7 @@ "node_modules/@sap/cds-dk/node_modules/proxy-addr": { "version": "2.0.7", "license": "MIT", + "optional": true, "peer": true, "dependencies": { "forwarded": "0.2.0", @@ -3920,11 +4090,13 @@ "node_modules/@sap/cds-dk/node_modules/proxy-from-env": { "version": "1.1.0", "license": "MIT", + "optional": true, "peer": true }, "node_modules/@sap/cds-dk/node_modules/punycode": { "version": "2.3.0", "license": "MIT", + "optional": true, "peer": true, "engines": { "node": ">=6" @@ -3933,6 +4105,7 @@ "node_modules/@sap/cds-dk/node_modules/qs": { "version": "6.11.0", "license": "BSD-3-Clause", + "optional": true, "peer": true, "dependencies": { "side-channel": "^1.0.4" @@ -3961,11 +4134,13 @@ } ], "license": "MIT", + "optional": true, "peer": true }, "node_modules/@sap/cds-dk/node_modules/range-parser": { "version": "1.2.1", "license": "MIT", + "optional": true, "peer": true, "engines": { "node": ">= 0.6" @@ -3974,6 +4149,7 @@ "node_modules/@sap/cds-dk/node_modules/raw-body": { "version": "2.5.1", "license": "MIT", + "optional": true, "peer": true, "dependencies": { "bytes": "3.1.2", @@ -4002,6 +4178,7 @@ "node_modules/@sap/cds-dk/node_modules/resolve-from": { "version": "4.0.0", "license": "MIT", + "optional": true, "peer": true, "engines": { "node": ">=4" @@ -4019,6 +4196,7 @@ "node_modules/@sap/cds-dk/node_modules/reusify": { "version": "1.0.4", "license": "MIT", + "optional": true, "peer": true, "engines": { "iojs": ">=1.0.0", @@ -4028,6 +4206,7 @@ "node_modules/@sap/cds-dk/node_modules/rimraf": { "version": "3.0.2", "license": "ISC", + "optional": true, "peer": true, "dependencies": { "glob": "^7.1.3" @@ -4056,6 +4235,7 @@ } ], "license": "MIT", + "optional": true, "peer": true, "dependencies": { "queue-microtask": "^1.2.2" @@ -4078,21 +4258,25 @@ } ], "license": "MIT", + "optional": true, "peer": true }, "node_modules/@sap/cds-dk/node_modules/safer-buffer": { "version": "2.1.2", "license": "MIT", + "optional": true, "peer": true }, "node_modules/@sap/cds-dk/node_modules/sax": { "version": "1.2.4", "license": "ISC", + "optional": true, "peer": true }, "node_modules/@sap/cds-dk/node_modules/semver": { "version": "7.5.4", "license": "ISC", + "optional": true, "peer": true, "dependencies": { "lru-cache": "^6.0.0" @@ -4107,6 +4291,7 @@ "node_modules/@sap/cds-dk/node_modules/semver/node_modules/lru-cache": { "version": "6.0.0", "license": "ISC", + "optional": true, "peer": true, "dependencies": { "yallist": "^4.0.0" @@ -4118,11 +4303,13 @@ "node_modules/@sap/cds-dk/node_modules/semver/node_modules/yallist": { "version": "4.0.0", "license": "ISC", + "optional": true, "peer": true }, "node_modules/@sap/cds-dk/node_modules/send": { "version": "0.18.0", "license": "MIT", + "optional": true, "peer": true, "dependencies": { "debug": "2.6.9", @@ -4146,6 +4333,7 @@ "node_modules/@sap/cds-dk/node_modules/send/node_modules/debug": { "version": "2.6.9", "license": "MIT", + "optional": true, "peer": true, "dependencies": { "ms": "2.0.0" @@ -4154,16 +4342,19 @@ "node_modules/@sap/cds-dk/node_modules/send/node_modules/debug/node_modules/ms": { "version": "2.0.0", "license": "MIT", + "optional": true, "peer": true }, "node_modules/@sap/cds-dk/node_modules/send/node_modules/ms": { "version": "2.1.3", "license": "MIT", + "optional": true, "peer": true }, "node_modules/@sap/cds-dk/node_modules/serve-static": { "version": "1.15.0", "license": "MIT", + "optional": true, "peer": true, "dependencies": { "encodeurl": "~1.0.2", @@ -4184,11 +4375,13 @@ "node_modules/@sap/cds-dk/node_modules/setprototypeof": { "version": "1.2.0", "license": "ISC", + "optional": true, "peer": true }, "node_modules/@sap/cds-dk/node_modules/shebang-command": { "version": "2.0.0", "license": "MIT", + "optional": true, "peer": true, "dependencies": { "shebang-regex": "^3.0.0" @@ -4200,6 +4393,7 @@ "node_modules/@sap/cds-dk/node_modules/shebang-regex": { "version": "3.0.0", "license": "MIT", + "optional": true, "peer": true, "engines": { "node": ">=8" @@ -4208,6 +4402,7 @@ "node_modules/@sap/cds-dk/node_modules/side-channel": { "version": "1.0.4", "license": "MIT", + "optional": true, "peer": true, "dependencies": { "call-bind": "^1.0.0", @@ -4288,6 +4483,7 @@ "node_modules/@sap/cds-dk/node_modules/source-map": { "version": "0.6.1", "license": "BSD-3-Clause", + "optional": true, "peer": true, "engines": { "node": ">=0.10.0" @@ -4331,6 +4527,7 @@ "node_modules/@sap/cds-dk/node_modules/statuses": { "version": "2.0.1", "license": "MIT", + "optional": true, "peer": true, "engines": { "node": ">= 0.8" @@ -4362,6 +4559,7 @@ "node_modules/@sap/cds-dk/node_modules/strip-ansi": { "version": "6.0.1", "license": "MIT", + "optional": true, "peer": true, "dependencies": { "ansi-regex": "^5.0.1" @@ -4373,6 +4571,7 @@ "node_modules/@sap/cds-dk/node_modules/strip-json-comments": { "version": "3.1.1", "license": "MIT", + "optional": true, "peer": true, "engines": { "node": ">=8" @@ -4384,6 +4583,7 @@ "node_modules/@sap/cds-dk/node_modules/supports-color": { "version": "7.2.0", "license": "MIT", + "optional": true, "peer": true, "dependencies": { "has-flag": "^4.0.0" @@ -4427,11 +4627,13 @@ "node_modules/@sap/cds-dk/node_modules/text-table": { "version": "0.2.0", "license": "MIT", + "optional": true, "peer": true }, "node_modules/@sap/cds-dk/node_modules/to-regex-range": { "version": "5.0.1", "license": "MIT", + "optional": true, "peer": true, "dependencies": { "is-number": "^7.0.0" @@ -4443,6 +4645,7 @@ "node_modules/@sap/cds-dk/node_modules/toidentifier": { "version": "1.0.1", "license": "MIT", + "optional": true, "peer": true, "engines": { "node": ">=0.6" @@ -4457,6 +4660,7 @@ "node_modules/@sap/cds-dk/node_modules/type-check": { "version": "0.4.0", "license": "MIT", + "optional": true, "peer": true, "dependencies": { "prelude-ls": "^1.2.1" @@ -4468,6 +4672,7 @@ "node_modules/@sap/cds-dk/node_modules/type-fest": { "version": "0.20.2", "license": "(MIT OR CC0-1.0)", + "optional": true, "peer": true, "engines": { "node": ">=10" @@ -4479,6 +4684,7 @@ "node_modules/@sap/cds-dk/node_modules/type-is": { "version": "1.6.18", "license": "MIT", + "optional": true, "peer": true, "dependencies": { "media-typer": "0.3.0", @@ -4521,6 +4727,7 @@ "node_modules/@sap/cds-dk/node_modules/unpipe": { "version": "1.0.0", "license": "MIT", + "optional": true, "peer": true, "engines": { "node": ">= 0.8" @@ -4529,6 +4736,7 @@ "node_modules/@sap/cds-dk/node_modules/uri-js": { "version": "4.4.1", "license": "BSD-2-Clause", + "optional": true, "peer": true, "dependencies": { "punycode": "^2.1.0" @@ -4543,6 +4751,7 @@ "node_modules/@sap/cds-dk/node_modules/utils-merge": { "version": "1.0.1", "license": "MIT", + "optional": true, "peer": true, "engines": { "node": ">= 0.4.0" @@ -4551,6 +4760,7 @@ "node_modules/@sap/cds-dk/node_modules/uuid": { "version": "9.0.0", "license": "MIT", + "optional": true, "peer": true, "bin": { "uuid": "dist/bin/uuid" @@ -4559,6 +4769,7 @@ "node_modules/@sap/cds-dk/node_modules/vary": { "version": "1.1.2", "license": "MIT", + "optional": true, "peer": true, "engines": { "node": ">= 0.8" @@ -4570,6 +4781,7 @@ "node >=0.6.0" ], "license": "MIT", + "optional": true, "peer": true, "dependencies": { "assert-plus": "^1.0.0", @@ -4596,6 +4808,7 @@ "node_modules/@sap/cds-dk/node_modules/which": { "version": "2.0.2", "license": "ISC", + "optional": true, "peer": true, "dependencies": { "isexe": "^2.0.0" @@ -4619,16 +4832,19 @@ "node_modules/@sap/cds-dk/node_modules/wordwrap": { "version": "1.0.0", "license": "MIT", + "optional": true, "peer": true }, "node_modules/@sap/cds-dk/node_modules/wrappy": { "version": "1.0.2", "license": "ISC", + "optional": true, "peer": true }, "node_modules/@sap/cds-dk/node_modules/ws": { "version": "8.13.0", "license": "MIT", + "optional": true, "peer": true, "engines": { "node": ">=10.0.0" @@ -4649,6 +4865,7 @@ "node_modules/@sap/cds-dk/node_modules/xml-js": { "version": "1.6.11", "license": "MIT", + "optional": true, "peer": true, "dependencies": { "sax": "^1.2.4" @@ -4660,6 +4877,7 @@ "node_modules/@sap/cds-dk/node_modules/xmlbuilder": { "version": "15.1.1", "license": "MIT", + "optional": true, "peer": true, "engines": { "node": ">=8.0" @@ -4668,6 +4886,7 @@ "node_modules/@sap/cds-dk/node_modules/yaml": { "version": "2.3.2", "license": "ISC", + "optional": true, "peer": true, "engines": { "node": ">= 14" @@ -4676,6 +4895,7 @@ "node_modules/@sap/cds-dk/node_modules/yocto-queue": { "version": "0.1.0", "license": "MIT", + "optional": true, "peer": true, "engines": { "node": ">=10" @@ -9809,10 +10029,10 @@ }, "postgres": { "name": "@cap-js/postgres", - "version": "1.3.0", + "version": "1.3.1", "license": "SEE LICENSE", "dependencies": { - "@cap-js/db-service": "^1.3.0", + "@cap-js/db-service": "^1.3.1", "pg": "^8" }, "engines": { @@ -9824,17 +10044,17 @@ "@sap/cds-dk": ">=7" }, "peerDependenciesMeta": { - "cds-dk": { + "@sap/cds-dk": { "optional": true } } }, "sqlite": { "name": "@cap-js/sqlite", - "version": "1.3.0", + "version": "1.3.1", "license": "SEE LICENSE", "dependencies": { - "@cap-js/db-service": "^1.3.0", + "@cap-js/db-service": "^1.3.1", "better-sqlite3": "^8" }, "engines": { diff --git a/package.json b/package.json index 63913e915..40c9980f1 100644 --- a/package.json +++ b/package.json @@ -12,7 +12,7 @@ "devDependencies": { "@sap/hana-client": "^2.16.26", "hdb": "^0.19.5", - "@capire/sflight": "sap-samples/cap-sflight", + "@capire/sflight": "github:sap-samples/cap-sflight", "eslint": "^8", "jest": "^29", "axios": "^1", diff --git a/release-please-config.json b/release-please-config.json index e0a8bad87..0f9c35b72 100644 --- a/release-please-config.json +++ b/release-please-config.json @@ -20,6 +20,11 @@ "type": "deps", "section": "Changed", "hidden": false + }, + { + "type": "perf", + "section": "Performance Improvements", + "hidden": false } ] } diff --git a/sqlite/test/lean-draft.test.js b/sqlite/test/lean-draft.test.js index 809e8eb8a..d935d2925 100644 --- a/sqlite/test/lean-draft.test.js +++ b/sqlite/test/lean-draft.test.js @@ -261,11 +261,11 @@ describe('draft tests', () => { ) expect(res.data.value.length).to.be.eq(1) expect(res.data.value[0]).to.containSubset({ - BeginDate: '2022-07-29', + BeginDate: '2023-08-04', BookingFee: 90, CurrencyCode_code: 'USD', Description: 'Vacation to USA', - EndDate: '2023-05-26', + EndDate: '2024-05-31', HasActiveEntity: true, // TotalPrice: 5624, // TravelID: 32, @@ -373,11 +373,11 @@ describe('draft tests', () => { ) expect(res.data.value.length).to.be.eq(1) expect(res.data.value[0]).to.containSubset({ - BeginDate: '2022-07-29', + BeginDate: '2023-08-04', BookingFee: 90, CurrencyCode_code: 'USD', Description: 'Vacation to USA', - EndDate: '2023-05-26', + EndDate: '2024-05-31', TotalPrice: 5624, TravelID: 32, TravelStatus_code: 'O', @@ -454,11 +454,11 @@ describe('draft tests', () => { ) expect(res.status).to.be.eq(200) expect(res.data.value[0]).to.containSubset({ - BeginDate: '2023-05-25', + BeginDate: '2024-05-30', BookingFee: 20, CurrencyCode_code: 'USD', Description: 'Sightseeing in New York City, New York', - EndDate: '2023-05-25', + EndDate: '2024-05-30', TotalPrice: 7375, TravelID: 4133, TravelStatus_code: 'A', @@ -517,11 +517,11 @@ describe('draft tests', () => { ) expect(res.status).to.be.eq(200) expect(res.data).to.containSubset({ - BeginDate: '2022-07-29', + BeginDate: '2023-08-04', BookingFee: 20, CurrencyCode_code: 'USD', Description: 'Business Trip for Christine, Pierre', - EndDate: '2022-07-29', + EndDate: '2023-08-04', TotalPrice: 900, TravelID: 1, TravelStatus_code: 'O', @@ -592,13 +592,13 @@ describe('draft tests', () => { ) expect(res.status).to.be.eq(200) expect(res.data.value[0]).to.containSubset({ - BookingDate: '2023-05-08', + BookingDate: '2024-05-13', BookingID: 1, BookingStatus_code: 'N', BookingUUID: '3A997221A8E4645C17002DF03754AB66', ConnectionID: '0018', CurrencyCode_code: 'USD', - FlightDate: '2023-05-25', + FlightDate: '2024-05-30', FlightPrice: 3657, to_Carrier_AirlineID: 'GA', to_Customer_CustomerID: '000115', diff --git a/test/bookshop/srv/admin-service.cds b/test/bookshop/srv/admin-service.cds index c5048e58e..fd36161f5 100644 --- a/test/bookshop/srv/admin-service.cds +++ b/test/bookshop/srv/admin-service.cds @@ -2,4 +2,11 @@ using { sap.capire.bookshop as my } from '../db/schema'; service AdminService @(requires:'admin', path:'/admin') { entity Books as projection on my.Books; entity Authors as projection on my.Authors; + + @cds.redirection.target: false + entity RenameKeys as projection on my.Books { + key ID as foo, + author, + author.name + } } diff --git a/test/scenarios/bookshop/delete.test.js b/test/scenarios/bookshop/delete.test.js index df6b16877..6bc789196 100644 --- a/test/scenarios/bookshop/delete.test.js +++ b/test/scenarios/bookshop/delete.test.js @@ -45,4 +45,16 @@ describe('Bookshop - Delete', () => { const del = DELETE.from('sap.capire.bookshop.A').where('ID = 1') await expect(cds.db.run(del)).to.be.eventually.rejectedWith('Transitive circular composition detected') }) + + test.skip('Delete with path expressions', async () => { + const deleteEmilysBooks = DELETE.from('AdminService.RenameKeys').where(`author.name = 'Emily'`) + const selectEmilysBooks = CQL`SELECT * FROM AdminService.Books where author.name = 'Emily'` + + const beforeDelete = await cds.run(selectEmilysBooks) + await cds.run(deleteEmilysBooks) + const afterDelete = await cds.run(selectEmilysBooks) + + expect(beforeDelete).toHaveLength(1) + expect(afterDelete).toHaveLength(0) + }) })