UNPKG

@sap/cds

Version:

SAP Cloud Application Programming Model - CDS for Node.js

46 lines (43 loc) 1.9 kB
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 }