UNPKG

2.87 kBJavaScriptView Raw
1"use strict";
2var __importDefault = (this && this.__importDefault) || function (mod) {
3 return (mod && mod.__esModule) ? mod : { "default": mod };
4};
5Object.defineProperty(exports, "__esModule", { value: true });
6const fs_1 = __importDefault(require("fs"));
7const path_1 = __importDefault(require("path"));
8const ServiceManager_1 = require("../ServiceManager");
9const debug_1 = require("../../debug");
10const debug = debug_1.createDebugLogger('pluginManager');
11class AbstractFileBasedPluginManager extends ServiceManager_1.AbstractPluginManager {
12 constructor(creationContext, locations, config) {
13 super(creationContext, config);
14 if (locations) {
15 this.loadFromLocations(locations);
16 }
17 }
18 static getPluginName(plugin) {
19 if (typeof plugin === 'string') {
20 return plugin;
21 }
22 return plugin.name;
23 }
24 loadFromLocations(pluginDirectories) {
25 if (pluginDirectories) {
26 pluginDirectories.forEach(directory => this.loadDirectory(directory));
27 }
28 return this;
29 }
30 loadDirectory(pluginDirectory) {
31 let stat;
32 try {
33 stat = fs_1.default.statSync(pluginDirectory);
34 }
35 catch (error) {
36 if (error.code === 'ENOENT') {
37 debug(`Directory "${pluginDirectory}" not found for plugin manager.`);
38 return;
39 }
40 throw error;
41 }
42 if (!stat.isDirectory()) {
43 throw new Error('Plugin location must be a directory.');
44 }
45 const plugins = fs_1.default.readdirSync(pluginDirectory)
46 .filter((fileName) => !!fileName.match(/^(?!.*index\.(js|ts)$).*(^.?|\.[^d]|[^.]d|[^.][^d])\.(js|ts)$/))
47 .map((fileName) => fileName.replace(/\.(js|ts)$/, ''))
48 .map((plugin) => {
49 const Plugin = require(path_1.default.resolve(pluginDirectory, plugin));
50 if (typeof Plugin === 'function') {
51 return Plugin;
52 }
53 if (typeof Plugin.default === 'function') {
54 return Plugin.default;
55 }
56 if (typeof Plugin[plugin] === 'function') {
57 return Plugin[plugin];
58 }
59 throw new TypeError(`Unable to load plugin "${plugin}" due to missing constructable export.`);
60 });
61 this.registerPlugins(plugins);
62 }
63 getPlugin(plugin) {
64 return this.get(plugin);
65 }
66 registerPlugins(plugins) {
67 plugins.forEach(Plugin => this.registerPlugin(Plugin));
68 return this;
69 }
70 registerPlugin(Plugin) {
71 this.registerInvokable(Plugin, Plugin);
72 this.registerAlias(Plugin.name, Plugin);
73 return this;
74 }
75}
76exports.AbstractFileBasedPluginManager = AbstractFileBasedPluginManager;
77//# sourceMappingURL=AbstractFileBasedPluginManager.js.map
\No newline at end of file