@sap/cds
Version:
SAP Cloud Application Programming Model - CDS for Node.js
46 lines (43 loc) • 1.9 kB
JavaScript
const DEBUG = /\b(y|all|plugins)\b/.test(process.env.DEBUG) ? console : undefined // eslint-disable-line no-console
const cds = require('.')
/**
* Fetch cds-plugins from project's package dependencies.
* Called in cds.env to populate the plugins configuration
* before the project's configuration is loaded.
*/
exports.fetch = function (DEV = process.env.NODE_ENV !== 'production') {
DEBUG?.time ('[cds.plugins] - fetched plugins in')
const plugins = JSON.parse(process.env.CDS_PLUGINS||'{}')
fetch_plugins_in (cds.home, false)
fetch_plugins_in (cds.root, DEV)
function fetch_plugins_in (root, dev) {
let pkg; try { pkg = require(root + '/package.json') } catch { return }
let deps = { ...pkg.dependencies, ...dev && pkg.devDependencies }
for (let each in deps) try {
let impl = require.resolve(each + '/cds-plugin', { paths: [root] })
plugins[each] = { impl }
} catch { /* no cds-plugin.js */ }
}
DEBUG?.timeEnd ('[cds.plugins] - fetched plugins in')
return plugins
}
/**
* Load and activate cds-plugins from project's package dependencies.
* Used in and made available through cds.plugins.
*/
exports.activate = async function (plugins = cds.env?.plugins || exports.fetch()) {
DEBUG?.time ('[cds.plugins] - loaded plugins in')
const all = Object.entries(plugins), { local } = cds.utils
const prioritized = {
'@sap/cds-mtxs': true, // plugins may register handlers for mtxs services
'@cap-js/telemetry': true // to allow better instrumentation
}
await Promise.all (all.map (([n,c]) => n in prioritized && _load(n,c)))
await Promise.all (all.map (([n,c]) => n in prioritized || _load(n,c)))
function _load (plugin, conf) {
DEBUG?.log(`[cds.plugins] - loading ${plugin}:`, { impl: local(conf.impl) })
return cds.utils._import (conf.impl)
}
DEBUG?.timeEnd ('[cds.plugins] - loaded plugins in')
return plugins
}