@sap/cds
Version:
SAP Cloud Application Programming Model - CDS for Node.js
53 lines (48 loc) • 1.77 kB
JavaScript
const cds = require ('../index')
const placeholders = [...'x'.repeat(9)].map((x,i) => `{${i+1}}`)
function prepareError(severity, code, message, target, args) {
let e // be filled in below...
if (code?.raw) {
if (typeof message === 'object') {
target = Object.keys(message)[0]
args = [ ...arguments ].slice(3)
e = {
message: String.raw (code, target, ...args),
target, text: '{0} '+ String.raw (code,'', ...placeholders.slice(0,args.length)).trim(),
args,
}
} else e = {
message: String.raw (code, ...[...arguments].slice(2))
}
} else {
if (typeof code === 'object') e = code; else {
if (typeof code === 'number') e = { code }; else [ code, message, target, args, e ] = [ undefined, code, message, target, {} ]
if (typeof message === 'object') e = Object.assign(message,e); else {
if (typeof target === 'object') [ target, args ] = [ undefined, target ]
if (message) e.message = message //; else if (code) e.message = String(code)
if (target) e.target = target
if (args) e.args = args
}
}
}
if (severity) e.numericSeverity ??= severity
return e
}
/**
* Messages Collector, used for `req.errors` and `req.messages`
*/
class Responses extends Array {
add (severity, code, message, target, args) {
const e = prepareError(severity, code, message, target, args)
this.push(e)
return e
}
}
class Errors extends Responses {
push(e) {
if ('stack' in e) return super.push (...arguments)
else Error.captureStackTrace (e = Object.assign(new Error,e), cds.Request.prototype.error)
return super.push(e)
}
}
module.exports = { Responses, Errors, prepareError }