@sap/cds
Version:
SAP Cloud Application Programming Model - CDS for Node.js
63 lines (54 loc) • 2.47 kB
JavaScript
const cds = require('..')
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))
}
module.exports = exports = function load (files, options) {
let any = cds.resolve(files,options)
// REVISIT: we need to find a better way to handle this -> doing that in cds.load is by far too central
// REVISIT: bandaid for grow as you go scenario with task queues enabled by default
let locations
if (cds.watched) {
const _is_outbox = p => cds.utils.path.posix.normalize(p).match(/\/cds\/srv\/outbox(\.cds)?$/)
const _outbox_only = any?.length === 1 && _is_outbox(any[0]) && (!Array.isArray(files) || !files.some(_is_outbox))
if (_outbox_only) {
any = undefined
locations = cds.resolve(files, false).filter(f => !_is_outbox(f))
}
}
if (!any) return Promise.reject (new cds.error ({
message: `Couldn't find a CDS model for '${files}' in ${cds.root}`,
code: 'MODEL_NOT_FOUND',
files, locations
}))
return this.get (any,options,'inferred')
}
exports.parsed = function cds_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 (!o.silent) cds.emit ('loaded', csn)
if (!o.silent) TRACE?.timeEnd('cds.compile *.cds'.padEnd(22))
return csn
}
}
const _sources4 = async (files) => {
const {path:{relative},fs:{promises:{readFile}}} = cds.utils, cwd = cds.root
const sources = await Promise.all (files.map (f => readFile(f,'utf-8')))
return files.reduce ((all,f,i) => { all[relative(cwd,f)] = sources[i]; return all },{})
}
exports.properties = (...args) => (exports.properties = require('./etc/properties').read) (...args)
exports.yaml = (file) => (exports.yaml = require('./etc/yaml').read) (file)
exports.csv = (file) => (exports.csv = require('./etc/csv').read) (file)