@sap/cds-hana
Advanced tools
Comparing version 0.9.0 to 1.0.3
@@ -9,2 +9,17 @@ # Changelog | ||
## Version 1.0.3 - 2018-11-27 | ||
### Changed | ||
- Throw db error instead of wrapping it in Sql Error | ||
- Use options.credentials instead of options directly | ||
### Fixed | ||
- Post processing of Binary, Boolean and Integer64 | ||
## Version 0.10.0 - 2018-10-17 | ||
- Refactoring and changes due to updated dependencies | ||
## Version 0.9.0 - 2018-10-04 | ||
@@ -11,0 +26,0 @@ |
@@ -5,3 +5,3 @@ const _notInjected = () => { | ||
const _validateInjection = (cds) => { | ||
const _validateInjection = cds => { | ||
if (!cds || typeof cds !== 'object') { | ||
@@ -8,0 +8,0 @@ throw new Error('Injected value is not of type `cds`') |
const hdb = require('hdb') | ||
const cdsSql = require('@sap/cds-sql') | ||
const {BaseClient} = cdsSql | ||
const {convertToISO, convertToISONoMillis, convertErrorCodeToString, convertToString} = require('../util') | ||
const { BaseClient } = cdsSql | ||
const { | ||
convertToBoolean, | ||
convertInt64ToString, | ||
convertToISO, | ||
convertToISONoMillis, | ||
convertErrorCodeToString, | ||
convertToString | ||
} = require('../util') | ||
@@ -10,30 +17,23 @@ class Client extends BaseClient { | ||
* | ||
* @param {Object} connect | ||
* @param {string} connect.host - database host | ||
* @param {number} connect.port - database port | ||
* @param {string} connect.user - username for authentication | ||
* @param {string} connect.password - password for authentication | ||
* @param {string} [connect.schema] - default schema to be used | ||
* @param {string} [connect.ca] - database certificate as needed by hdb driver | ||
* @param {string} [connect.certificate] - database certificate as provided by instance manager | ||
* @param {Object} credentials | ||
* @param {string} credentials.host - database host | ||
* @param {number} credentials.port - database port | ||
* @param {string} credentials.user - username for authentication | ||
* @param {string} credentials.password - password for authentication | ||
* @param {string} [credentials.schema] - default schema to be used | ||
* @param {string} [credentials.ca] - database certificate as needed by hdb driver | ||
* | ||
*/ | ||
constructor (connect) { | ||
constructor (credentials) { | ||
super([ | ||
['cds.Boolean', Boolean], | ||
['cds.Integer64', String], | ||
['cds.Boolean', convertToBoolean], | ||
['cds.Integer64', convertInt64ToString], | ||
['cds.DateTime', convertToISONoMillis], | ||
['cds.Timestamp', convertToISO], | ||
// ['cds.Binary', convertToBuffer], | ||
// ['cds.LargeBinary', convertToBuffer], | ||
['cds.LargeString', convertToString] | ||
]) | ||
this._connect = connect | ||
this._credentials = credentials | ||
if (!this._connect.hasOwnProperty('ca') && this._connect.certificate) { | ||
this._connect.ca = this._connect.certificate | ||
} | ||
this._dbc = hdb.createClient(this._connect) | ||
this._dbc = hdb.createClient(this._credentials) | ||
this._user = 'ANONYMOUS' // Use anonymous HANA user as default | ||
@@ -47,6 +47,5 @@ // auto-commit is true by default | ||
if (this._isInUse) { | ||
this.connect() | ||
.catch(() => { | ||
this._isInUse = false | ||
}) | ||
this.connect().catch(() => { | ||
this._isInUse = false | ||
}) | ||
} | ||
@@ -63,3 +62,3 @@ }) | ||
return new Promise((resolve, reject) => { | ||
this._dbc.connect((err) => { | ||
this._dbc.connect(err => { | ||
if (err) { | ||
@@ -69,4 +68,4 @@ return reject(convertErrorCodeToString(err)) | ||
if (this._connect.schema) { | ||
this.execute(`SET SCHEMA ${this._connect.schema}`) | ||
if (this._credentials.schema) { | ||
this.execute(`SET SCHEMA ${this._credentials.schema}`) | ||
.then(() => { | ||
@@ -76,3 +75,3 @@ this._isInUse = true | ||
}) | ||
.catch((err) => { | ||
.catch(err => { | ||
this._dbc.end() | ||
@@ -153,11 +152,20 @@ reject(convertErrorCodeToString(err)) | ||
const {sql, values = []} = cdsSql.builder.sqlFactory(query, { | ||
typeConversion: this._typeConversionMap, | ||
customBuilder: require('../customBuilder/'), | ||
user: this._user | ||
}, this._csn) | ||
const { sql, values = [] } = cdsSql.builder.sqlFactory( | ||
query, | ||
{ | ||
typeConversion: this._typeConversionMap, | ||
customBuilder: require('../customBuilder/'), | ||
user: this._user | ||
}, | ||
this._csn | ||
) | ||
const {postProcessing: {getPostProcessMapper, getPropertyMapper}} = cdsSql | ||
const { postProcessing: { getPostProcessMapper, getPropertyMapper } } = cdsSql | ||
return this._executeSQL(sql, values, getPostProcessMapper(this._toService, this._csn, query), getPropertyMapper(this._csn, query, true)) | ||
return this._executeSQL( | ||
sql, | ||
values, | ||
getPostProcessMapper(this._toService, this._csn, query), | ||
getPropertyMapper(this._csn, query, true) | ||
) | ||
} catch (err) { | ||
@@ -176,10 +184,9 @@ // in case an object is passed and sql builder throws an error | ||
const {sql, values} = cdsSql.builder.sqlFactory(cqn) | ||
const { sql, values } = cdsSql.builder.sqlFactory(cqn) | ||
sqls.push(this._executeExpand(sql, values)) | ||
} | ||
return Promise.all(sqls) | ||
.then((results) => { | ||
return cdsSql.expand.rawToExpanded(expandQueries, results) | ||
}) | ||
return Promise.all(sqls).then(results => { | ||
return cdsSql.expand.rawToExpanded(expandQueries, results) | ||
}) | ||
} | ||
@@ -189,6 +196,5 @@ | ||
if (Array.isArray(values) && values.length !== 0) { | ||
return this.prepareStatement(sql) | ||
.then((statement) => { | ||
return statement.execute(values) | ||
}) | ||
return this.prepareStatement(sql).then(statement => { | ||
return statement.execute(values) | ||
}) | ||
} | ||
@@ -199,3 +205,5 @@ | ||
if (err) { | ||
return reject(new cdsSql.errors.SqlError(convertErrorCodeToString(err), sql, values)) | ||
convertErrorCodeToString(err) | ||
err.failedQuery = sql | ||
return reject(err) | ||
} | ||
@@ -211,9 +219,9 @@ | ||
return this.prepareStatement(sql) | ||
.then((statement) => { | ||
.then(statement => { | ||
return statement.execute(values) | ||
}) | ||
.then((result) => { | ||
.then(result => { | ||
return Promise.resolve(cdsSql.postProcessing.postProcess(result, postMapper, propertyMapper)) | ||
}) | ||
.catch((err) => { | ||
.catch(err => { | ||
return Promise.reject(err) | ||
@@ -226,3 +234,5 @@ }) | ||
if (err) { | ||
return reject(new cdsSql.errors.SqlError(convertErrorCodeToString(err), sql, values)) | ||
convertErrorCodeToString(err) | ||
err.failedQuery = sql | ||
return reject(err) | ||
} | ||
@@ -245,3 +255,5 @@ | ||
if (err) { | ||
return reject(new cdsSql.errors.SqlError(convertErrorCodeToString(err), sql)) | ||
convertErrorCodeToString(err) | ||
err.failedQuery = sql | ||
return reject(err) | ||
} | ||
@@ -320,3 +332,3 @@ const HdbStatement = require('../statement/HdbStatement') | ||
return new Promise((resolve, reject) => { | ||
this._dbc.commit((err) => { | ||
this._dbc.commit(err => { | ||
if (err) { | ||
@@ -346,3 +358,3 @@ return reject(convertErrorCodeToString(err)) | ||
return new Promise((resolve, reject) => { | ||
this._dbc.rollback((err) => { | ||
this._dbc.rollback(err => { | ||
if (err) { | ||
@@ -375,7 +387,9 @@ return reject(convertErrorCodeToString(err)) | ||
_addDropsToChain (chain, drop) { | ||
return chain.then(() => this.run(drop).catch((err) => { | ||
if (!this._ignoreError(err)) { | ||
throw err | ||
} | ||
})) | ||
return chain.then(() => | ||
this.run(drop).catch(err => { | ||
if (!this._ignoreError(err)) { | ||
throw err | ||
} | ||
}) | ||
) | ||
} | ||
@@ -385,3 +399,3 @@ | ||
// hana error code for table/view does not exist | ||
return err instanceof cdsSql.errors.SqlError && (err.rootCause.code === '259' || err.rootCause.code === '321') | ||
return err.code === '259' || err.code === '321' | ||
} | ||
@@ -388,0 +402,0 @@ } |
/** | ||
* Validates the connect and pool options and adds defaults if not given. | ||
* @param {Object} options - The db connection options. | ||
* @param {Object} options.database - The db name. | ||
* @param {Object} options.url - The db url. | ||
* @param {string} [options.host] - Address to the db | ||
* @param {string} [options.port] - Port for db | ||
* @param {string} [options.user] - Username for authentication | ||
* @param {string} [options.password] - Password for authentication | ||
* @param {Object} [pool] - The min and max pool options. | ||
* @param {number} [pool.min] - The minimum number of db connection clients. | ||
* @param {number} [pool.max] - The maximum number of db connection clients. | ||
* @param {Object} options.credentials - The credentials. | ||
* @param {Object} [options.pool] - The min and max pool options. | ||
* @param {number} [options.pool.min] - The minimum number of db connection clients. | ||
* @param {number} [options.pool.max] - The maximum number of db connection clients. | ||
*/ | ||
const options = (options) => { | ||
// TODO: Clarify what should be done with respect to .database and .url. Shall it be parsed here or will it be parsed in ql so we can ignore it here? | ||
// options.host = options.host || options.database || options.url | ||
const options = options => { | ||
options.pool.min = options.pool.min || 1 | ||
options.pool.max = options.pool.max || 100 | ||
options.pool.idleTimeoutMillisForPools = options.pool.idleTimeoutMillisForPools || 60000 | ||
options.pool.evictionRunIntervalMillis = options.pool.evictionRunIntervalMillis || 10000 | ||
if (options.credentials && !('ca' in options.credentials) && options.credentials.certificate) { | ||
options.credentials.ca = options.credentials.certificate | ||
} | ||
} | ||
module.exports = options |
@@ -6,3 +6,3 @@ const CreateBuilder = require('@sap/cds-sql').builder.CreateBuilder | ||
const SelectBuilder = require('./CustomSelectBuilder') | ||
Object.defineProperty(this, 'SelectBuilder', {value: SelectBuilder}) | ||
Object.defineProperty(this, 'SelectBuilder', { value: SelectBuilder }) | ||
return SelectBuilder | ||
@@ -9,0 +9,0 @@ } |
@@ -6,3 +6,3 @@ const DeleteBuilder = require('@sap/cds-sql').builder.DeleteBuilder | ||
const ExpressionBuilder = require('./CustomExpressionBuilder') | ||
Object.defineProperty(this, 'ExpressionBuilder', {value: ExpressionBuilder}) | ||
Object.defineProperty(this, 'ExpressionBuilder', { value: ExpressionBuilder }) | ||
return ExpressionBuilder | ||
@@ -9,0 +9,0 @@ } |
@@ -6,3 +6,3 @@ const ExpressionBuilder = require('@sap/cds-sql').builder.ExpressionBuilder | ||
const SelectBuilder = require('./CustomSelectBuilder') | ||
Object.defineProperty(this, 'SelectBuilder', {value: SelectBuilder}) | ||
Object.defineProperty(this, 'SelectBuilder', { value: SelectBuilder }) | ||
return SelectBuilder | ||
@@ -13,3 +13,3 @@ } | ||
const ReferenceBuilder = require('./CustomReferenceBuilder') | ||
Object.defineProperty(this, 'ReferenceBuilder', {value: ReferenceBuilder}) | ||
Object.defineProperty(this, 'ReferenceBuilder', { value: ReferenceBuilder }) | ||
return ReferenceBuilder | ||
@@ -16,0 +16,0 @@ } |
@@ -6,3 +6,3 @@ const ReferenceBuilder = require('@sap/cds-sql').builder.ReferenceBuilder | ||
const SelectBuilder = require('./CustomSelectBuilder') | ||
Object.defineProperty(this, 'SelectBuilder', {value: SelectBuilder}) | ||
Object.defineProperty(this, 'SelectBuilder', { value: SelectBuilder }) | ||
return SelectBuilder | ||
@@ -14,3 +14,9 @@ } | ||
const columnsString = `(${this._columnsFromContains(this._obj.ref[1].args).join(', ')})` | ||
this._outputObj.sql.push(`${contains ? '' : 'NOT '}CONTAINS(`, `${columnsString},`, `${this._options.placeholder},`, 'FUZZY(0.9)', ')') | ||
this._outputObj.sql.push( | ||
`${contains ? '' : 'NOT '}CONTAINS(`, | ||
`${columnsString},`, | ||
`${this._options.placeholder},`, | ||
'FUZZY(0.9)', | ||
')' | ||
) | ||
@@ -27,3 +33,4 @@ const params = this._obj.ref[1].args.slice(1) | ||
searchTerm = `${searchTerm} OR ` | ||
} else { // param === 'not' | ||
} else { | ||
// param === 'not' | ||
searchTerm = `${searchTerm}-` | ||
@@ -30,0 +37,0 @@ } |
@@ -6,3 +6,3 @@ const SelectBuilder = require('@sap/cds-sql').builder.SelectBuilder | ||
const ExpressionBuilder = require('./CustomExpressionBuilder') | ||
Object.defineProperty(this, 'ExpressionBuilder', {value: ExpressionBuilder}) | ||
Object.defineProperty(this, 'ExpressionBuilder', { value: ExpressionBuilder }) | ||
return ExpressionBuilder | ||
@@ -13,7 +13,15 @@ } | ||
const ReferenceBuilder = require('./CustomReferenceBuilder') | ||
Object.defineProperty(this, 'ReferenceBuilder', {value: ReferenceBuilder}) | ||
Object.defineProperty(this, 'ReferenceBuilder', { value: ReferenceBuilder }) | ||
return ReferenceBuilder | ||
} | ||
_val (obj) { | ||
if (typeof obj.val === 'boolean') { | ||
return obj.val ? 'true' : 'false' | ||
} | ||
return obj.val | ||
} | ||
} | ||
module.exports = CustomSelectBuilder |
@@ -6,3 +6,3 @@ const UpdateBuilder = require('@sap/cds-sql').builder.UpdateBuilder | ||
const ExpressionBuilder = require('./CustomExpressionBuilder') | ||
Object.defineProperty(this, 'ExpressionBuilder', {value: ExpressionBuilder}) | ||
Object.defineProperty(this, 'ExpressionBuilder', { value: ExpressionBuilder }) | ||
return ExpressionBuilder | ||
@@ -13,3 +13,3 @@ } | ||
const ReferenceBuilder = require('./CustomReferenceBuilder') | ||
Object.defineProperty(this, 'ReferenceBuilder', {value: ReferenceBuilder}) | ||
Object.defineProperty(this, 'ReferenceBuilder', { value: ReferenceBuilder }) | ||
return ReferenceBuilder | ||
@@ -16,0 +16,0 @@ } |
const dependencies = { | ||
get CreateBuilder () { | ||
const CustomCreateBuilder = require('./CustomCreateBuilder') | ||
Object.defineProperty(dependencies, 'CreateBuilder', {value: CustomCreateBuilder}) | ||
Object.defineProperty(dependencies, 'CreateBuilder', { value: CustomCreateBuilder }) | ||
return CustomCreateBuilder | ||
@@ -9,3 +9,3 @@ }, | ||
const CustomDeleteBuilder = require('./CustomDeleteBuilder') | ||
Object.defineProperty(dependencies, 'DeleteBuilder', {value: CustomDeleteBuilder}) | ||
Object.defineProperty(dependencies, 'DeleteBuilder', { value: CustomDeleteBuilder }) | ||
return CustomDeleteBuilder | ||
@@ -15,3 +15,3 @@ }, | ||
const CustomDropBuilder = require('./CustomDropBuilder') | ||
Object.defineProperty(dependencies, 'DropBuilder', {value: CustomDropBuilder}) | ||
Object.defineProperty(dependencies, 'DropBuilder', { value: CustomDropBuilder }) | ||
return CustomDropBuilder | ||
@@ -21,3 +21,3 @@ }, | ||
const CustomSelectBuilder = require('./CustomSelectBuilder') | ||
Object.defineProperty(dependencies, 'SelectBuilder', {value: CustomSelectBuilder}) | ||
Object.defineProperty(dependencies, 'SelectBuilder', { value: CustomSelectBuilder }) | ||
return CustomSelectBuilder | ||
@@ -27,3 +27,3 @@ }, | ||
const CustomUpdateBuilder = require('./CustomUpdateBuilder') | ||
Object.defineProperty(dependencies, 'UpdateBuilder', {value: CustomUpdateBuilder}) | ||
Object.defineProperty(dependencies, 'UpdateBuilder', { value: CustomUpdateBuilder }) | ||
return CustomUpdateBuilder | ||
@@ -30,0 +30,0 @@ } |
const dependencies = { | ||
get Client () { | ||
const Client = require('./client/Client') | ||
Object.defineProperty(dependencies, 'Client', {value: Client}) | ||
Object.defineProperty(dependencies, 'Client', { value: Client }) | ||
return Client | ||
@@ -9,3 +9,3 @@ }, | ||
const options = require('./client/options') | ||
Object.defineProperty(dependencies, 'options', {value: options}) | ||
Object.defineProperty(dependencies, 'options', { value: options }) | ||
return options | ||
@@ -12,0 +12,0 @@ }, |
@@ -0,1 +1,3 @@ | ||
const { convertErrorCodeToString } = require('../util') | ||
class HdbStatement { | ||
@@ -37,6 +39,6 @@ /** | ||
if (err) { | ||
const {errors: {SqlError}} = require('@sap/cds-sql') | ||
const {convertErrorCodeToString} = require('../util') | ||
convertErrorCodeToString(err) | ||
err.failedQuery = this._sql | ||
return reject(new SqlError(convertErrorCodeToString(err), this._sql, values)) | ||
return reject(err) | ||
} | ||
@@ -43,0 +45,0 @@ |
@@ -7,3 +7,3 @@ /** | ||
*/ | ||
const convertErrorCodeToString = (err) => { | ||
const convertErrorCodeToString = err => { | ||
if (typeof err.code === 'number') { | ||
@@ -16,9 +16,29 @@ err.code = err.code.toString() | ||
const convertToISO = (element) => { | ||
return new Date(element).toISOString() | ||
const convertToBoolean = boolean => { | ||
if (boolean === null) { | ||
return null | ||
} | ||
return Boolean(boolean) | ||
} | ||
const convertToISONoMillis = (element) => { | ||
const convertInt64ToString = int64 => { | ||
if (int64 === null) { | ||
return null | ||
} | ||
return String(int64) | ||
} | ||
const convertToISO = element => { | ||
if (element) { | ||
const dateTime = new Date(element).toISOString() | ||
return new Date(element + 'Z').toISOString() | ||
} | ||
return null | ||
} | ||
const convertToISONoMillis = element => { | ||
if (element) { | ||
const dateTime = new Date(element + 'Z').toISOString() | ||
return dateTime.slice(0, 19) + dateTime.slice(23) | ||
@@ -30,8 +50,13 @@ } | ||
// const convertToBuffer = (element) => { return Buffer.from(element) } | ||
const convertToString = (element) => { | ||
return Buffer.from(element, 'base64').toString() | ||
const convertToString = element => { | ||
if (element) { | ||
return Buffer.from(element, 'base64').toString() | ||
} | ||
return null | ||
} | ||
module.exports = { | ||
convertToBoolean, | ||
convertInt64ToString, | ||
convertToISO, | ||
@@ -38,0 +63,0 @@ convertToISONoMillis, |
{ | ||
"name": "@sap/cds-hana", | ||
"version": "0.9.0", | ||
"version": "1.0.3", | ||
"dependencies": { | ||
"@sap/cds-sql": { | ||
"version": "0.11.0" | ||
"version": "1.0.3" | ||
} | ||
} | ||
} |
@@ -1,1 +0,1 @@ | ||
{"bundleDependencies":false,"dependencies":{"@sap/cds-sql":"0.11.0"},"deprecated":false,"description":"Driver package for access to hana database, including setting up the client, configuring all the necessary options to initiate the connection and handling database specifics so that they can be processed on our end.","devDependencies":{"@sap/cds":"git://github.wdf.sap.corp/cdx/cds","hdb":"^0.16.0","jest":"^23.4.0","jest-junit":"^5.1.0","jsdoc-to-markdown":"^4.0.0","standard":"^11.0.0","standard-reporter":"^1.0.0"},"engines":{"node":">= 6.11.0"},"jest":{"testEnvironment":"node"},"jest-junit":{"suiteName":"jest tests","output":"reports/sonar/test-reporter.xml","classNameTemplate":"{classname}-{title}","titleTemplate":"{classname}-{title}","ancestorSeparator":" › ","usePathForSuiteName":"true"},"main":"lib/index.js","name":"@sap/cds-hana","scripts":{"build":"npm run test && npm run jsdoc2md","clean":"rm -rf reports && rm -f npm-debug.log","jsdoc2md":"jsdoc2md --param-list-format list lib/**/*.js > docs/api.md","lint":"([ -d reports ] || mkdir reports) && standard --env jest && standard | standard-reporter --checkstyle > reports/eslint.jslint.xml","test":"npm run clean && npm run lint && npm run test-unit","test-integration":"jest --config=jest-integration.json && [ -e reports/sonar/test-reporter.xml ] && mv reports/sonar/test-reporter.xml reports/sonar/test-integration.xml","test-unit":"jest --config=jest-unit.json && [ -e reports/sonar/test-reporter.xml ] && mv reports/sonar/test-reporter.xml reports/sonar/test-unit.xml"},"standard":{"env":["jest"],"globals":["jest"]},"version":"0.9.0","license":"SEE LICENSE IN developer-license-3.1.txt"} | ||
{"bundleDependencies":false,"dependencies":{"@sap/cds-sql":"1.0.3"},"deprecated":false,"description":"Driver package for access to hana database, including setting up the client, configuring all the necessary options to initiate the connection and handling database specifics so that they can be processed on our end.","devDependencies":{"hdb":"^0.16.0","husky":"^1.2.0","jest":"^23.6.0","jest-junit":"^5.2.0","jsdoc-to-markdown":"^4.0.1","lint-staged":"^8.1.0","prettier-standard":"^8.0.1","standard":"^12.0.1","standard-reporter":"^1.0.5"},"engines":{"node":">= 8.0.0"},"husky":{"hooks":{"pre-commit":"lint-staged"}},"jest":{"testEnvironment":"node"},"jest-junit":{"suiteName":"jest tests","output":"reports/sonar/test-reporter.xml","classNameTemplate":"{classname}-{title}","titleTemplate":"{classname}-{title}","ancestorSeparator":" › ","usePathForSuiteName":"true"},"lint-staged":{"{lib,test}/**/*.js":["prettier-standard","standard --fix","git add"]},"main":"lib/index.js","name":"@sap/cds-hana","scripts":{"build":"npm run test && npm run jsdoc2md","clean":"rm -rf reports && rm -f npm-debug.log","jsdoc2md":"jsdoc2md --param-list-format list lib/**/*.js > docs/api.md","lint":"([ -d reports ] || mkdir reports) && standard --env jest && standard | standard-reporter --checkstyle > reports/eslint.jslint.xml","prepareRelease":"node node_modules/filter-node-package package.json","snapshots":"[ -e .pipeline/snapshots.sh ] && sh .pipeline/snapshots.sh","test":"npm run clean && npm run lint && npm run test-unit","test-integration":"jest --config=jest-integration.json && [ -e reports/sonar/test-reporter.xml ] && mv reports/sonar/test-reporter.xml reports/sonar/test-integration.xml","test-unit":"jest --config=jest-unit.json && [ -e reports/sonar/test-reporter.xml ] && mv reports/sonar/test-reporter.xml reports/sonar/test-unit.xml"},"standard":{"env":["jest"],"globals":["jest"]},"version":"1.0.3","license":"SEE LICENSE IN developer-license-3.1.txt"} |
Sorry, the diff of this file is not supported yet
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
No v1
QualityPackage is not semver >=1. This means it is not stable and does not support ^ ranges.
Found 1 instance in 1 package
49622
665
1
9
+ Added@sap/cds-sql@1.0.3(transitive)
- Removed@sap/cds-sql@0.11.0(transitive)
Updated@sap/cds-sql@1.0.3