loopback-datasource-juggler/lib/plugins.js

70 lines
1.6 KiB
JavaScript

var fs = require('fs');
var path = require('path');
var debug = require('debug')('loopback:plugin');
var registry = {};
exports.apply = function applyPlugin(name, modelClass, options) {
var fn = registry[name];
if (typeof fn === 'function') {
if (modelClass.dataSource) {
fn(modelClass, options || {});
} else {
modelClass.once('dataSourceAttached', function() {
fn(modelClass, options || {});
});
}
} else {
debug('Invalid plugin: %s', name);
}
};
var definePlugin = exports.define = function definePlugin(name, fn) {
if (typeof fn === 'function') {
if (registry[name]) {
debug('Duplicate plugin: %s', name);
} else {
debug('Defining plugin: %s', name);
}
registry[name] = fn;
} else {
debug('Invalid plugin function: %s', name);
}
};
var loadPlugins = exports.load = function loadPlugins(dir) {
var files = tryReadDir(path.resolve(dir));
files.forEach(function(filename) {
var filepath = path.resolve(path.join(dir, filename));
var ext = path.extname(filename);
var name = path.basename(filename, ext);
var stats = fs.statSync(filepath);
if (stats.isFile()) {
if (ext in require.extensions) {
var plugin = tryRequire(filepath);
if (typeof plugin === 'function') {
definePlugin(name, plugin);
}
}
}
});
};
loadPlugins(path.join(__dirname, 'plugins'));
function tryReadDir() {
try {
return fs.readdirSync.apply(fs, arguments);
} catch(e) {
return [];
}
};
function tryRequire(file) {
try {
return require(file);
} catch(e) {
}
};