@sap/cds
Version:
SAP Cloud Application Programming Model - CDS for Node.js
60 lines (48 loc) • 2.17 kB
JavaScript
module.exports = exports = load
exports.parsed = get
const cds = require ('../index.js')
const outbox_cds = cds.env.requires.queue?.model
const [ outbox ] = cds.resolve (outbox_cds) || []
const TRACE = cds.debug('trace')
if (TRACE) {
TRACE?.time('require cds.compiler'.padEnd(22))
require('@sap/cds-compiler/lib/compiler')
TRACE?.timeEnd('require cds.compiler'.padEnd(22))
}
function load (models, options) {
const files = cds.resolve (models, options)
if (!files || cds.watched && files == outbox) return Promise.reject (new cds.error ({
message: `Couldn't find a CDS model for '${models}' in ${cds.root}`,
files: cds.resolve(models,false)?.filter (f => f !== outbox_cds),
code: 'MODEL_NOT_FOUND',
}))
return get (files, options, 'inferred')
}
function get (files, options, _flavor) {
const o = typeof options === 'string' ? { flavor:options } : options || {}
if (!files) files = ['*']; else if (!Array.isArray(files)) files = [files]
if (o.files || o.flavor === 'files') return cds.resolve(files,o)
if (o.sources || o.flavor === 'sources') return _sources4 (cds.resolve(files,o))
if (!o.silent) TRACE?.time('cds.compile *.cds'.padEnd(22))
const csn = cds.compile (files,o,
o.parse ? 'parsed' :
o.plain ? 'xtended' :
o.clean ? 'xtended' : // for compatibility
o.flavor || _flavor || 'parsed'
)
return csn.then?.(_finalize) || _finalize(csn)
function _finalize (csn) {
if (outbox) csn.$sources = csn.$sources.filter (f => f !== outbox)
if (!o.silent) cds.emit ('loaded', csn)
if (!o.silent) TRACE?.timeEnd('cds.compile *.cds'.padEnd(22))
return csn
}
async function _sources4 (files) {
const {relative} = cds.utils.path, {readFile} = cds.utils.fs.promises
const all = await Promise.all (files.map (f => readFile(f,'utf-8')))
return files.reduce ((d,f,i) => (d[relative(cds.root,f)] = all[i], d),{})
}
}
exports.properties = (...args) => (exports.properties = require('./etc/properties').read) (...args)
exports.yaml = (...args) => (exports.yaml = require('./etc/yaml').read) (...args)
exports.csv = (...args) => (exports.csv = require('./etc/csv').read) (...args)