1 | ;
|
2 | Object.defineProperty(exports, "__esModule", { value: true });
|
3 | var tslib_1 = require("tslib");
|
4 | var fs_extra_1 = tslib_1.__importDefault(require("fs-extra"));
|
5 | var path_1 = tslib_1.__importDefault(require("path"));
|
6 | var commander_1 = require("./lib/commander");
|
7 | var pkg_up_1 = tslib_1.__importDefault(require("pkg-up"));
|
8 | var resolve_pkg_1 = tslib_1.__importDefault(require("resolve-pkg"));
|
9 | var config_1 = require("./lib/config");
|
10 | var debug = require('debug')('app:main');
|
11 | var plugin_1 = require("./lib/plugin");
|
12 | var requireg = require('requireg');
|
13 | var globalDirs = require('global-dirs');
|
14 | var App = /** @class */ (function () {
|
15 | function App() {
|
16 | var _this = this;
|
17 | /**
|
18 | * plugin's name
|
19 | */
|
20 | this.plugins = [];
|
21 | /**
|
22 | * is plugin folder
|
23 | */
|
24 | this.isPluginFolder = function (folder) {
|
25 | return new RegExp(_this.conf.prefix).test(folder);
|
26 | };
|
27 | this.conf = config_1.getConf();
|
28 | this.program = commander_1.getProgram();
|
29 | }
|
30 | /**
|
31 | * add plugin
|
32 | * @param pluginName plugin name
|
33 | * @param cwd plugin cwd
|
34 | */
|
35 | App.prototype.addPlugin = function (pluginName, cwd, checkDeps) {
|
36 | if (checkDeps === void 0) { checkDeps = true; }
|
37 | return tslib_1.__awaiter(this, void 0, void 0, function () {
|
38 | var pkgCwd, plugin, plug, Plug;
|
39 | return tslib_1.__generator(this, function (_a) {
|
40 | switch (_a.label) {
|
41 | case 0:
|
42 | debug('add plugin: %o at %o', pluginName, cwd);
|
43 | pkgCwd = pkg_up_1.default.sync(cwd);
|
44 | if (!pkgCwd) {
|
45 | return [2 /*return*/];
|
46 | }
|
47 | if (!checkDeps) return [3 /*break*/, 2];
|
48 | // add missing deps
|
49 | return [4 /*yield*/, require('check-dependencies')({
|
50 | install: true,
|
51 | verbose: false,
|
52 | packageDir: cwd,
|
53 | })];
|
54 | case 1:
|
55 | // add missing deps
|
56 | _a.sent();
|
57 | _a.label = 2;
|
58 | case 2:
|
59 | if (!this.plugins.includes(pluginName)) {
|
60 | plugin = requireg(cwd);
|
61 | plug = plugin.default || plugin;
|
62 | if (typeof plug === 'function') {
|
63 | try {
|
64 | Plug = new plugin_1.Plugin(this.program, this.conf, pkgCwd);
|
65 | plug(Plug);
|
66 | this.plugins.push(pluginName);
|
67 | debug('loading plugin at path: %o succeed', cwd);
|
68 | }
|
69 | catch (error) {
|
70 | debug('loading plugin at path: %o failed with errors: %o', cwd, error);
|
71 | }
|
72 | }
|
73 | else {
|
74 | debug('loading plugin at path: %o failed\n%s must be a function instead of %o', cwd, pluginName, typeof plug);
|
75 | }
|
76 | }
|
77 | return [2 /*return*/];
|
78 | }
|
79 | });
|
80 | });
|
81 | };
|
82 | /**
|
83 | * load local plugins defined by user
|
84 | * @param dir dir for local plugins
|
85 | */
|
86 | App.prototype.loadPluginsByDir = function (dir, checkDeps) {
|
87 | if (checkDeps === void 0) { checkDeps = true; }
|
88 | return tslib_1.__awaiter(this, void 0, void 0, function () {
|
89 | var _this = this;
|
90 | var folders, folders_1, folders_1_1, f, cwd, e_1_1, e_1, _a;
|
91 | return tslib_1.__generator(this, function (_b) {
|
92 | switch (_b.label) {
|
93 | case 0:
|
94 | if (!fs_extra_1.default.pathExistsSync(dir)) {
|
95 | debug('Not found local plugins at: %o', dir);
|
96 | return [2 /*return*/];
|
97 | }
|
98 | return [4 /*yield*/, fs_extra_1.default.readdir(dir)];
|
99 | case 1:
|
100 | folders = _b.sent();
|
101 | if (!(folders && folders.length)) return [3 /*break*/, 9];
|
102 | folders = folders.filter(function (f) { return _this.isPluginFolder(f); });
|
103 | _b.label = 2;
|
104 | case 2:
|
105 | _b.trys.push([2, 7, 8, 9]);
|
106 | folders_1 = tslib_1.__values(folders), folders_1_1 = folders_1.next();
|
107 | _b.label = 3;
|
108 | case 3:
|
109 | if (!!folders_1_1.done) return [3 /*break*/, 6];
|
110 | f = folders_1_1.value;
|
111 | cwd = path_1.default.join(dir, f);
|
112 | return [4 /*yield*/, this.addPlugin(f, cwd, checkDeps)];
|
113 | case 4:
|
114 | _b.sent();
|
115 | _b.label = 5;
|
116 | case 5:
|
117 | folders_1_1 = folders_1.next();
|
118 | return [3 /*break*/, 3];
|
119 | case 6: return [3 /*break*/, 9];
|
120 | case 7:
|
121 | e_1_1 = _b.sent();
|
122 | e_1 = { error: e_1_1 };
|
123 | return [3 /*break*/, 9];
|
124 | case 8:
|
125 | try {
|
126 | if (folders_1_1 && !folders_1_1.done && (_a = folders_1.return)) _a.call(folders_1);
|
127 | }
|
128 | finally { if (e_1) throw e_1.error; }
|
129 | return [7 /*endfinally*/];
|
130 | case 9: return [2 /*return*/];
|
131 | }
|
132 | });
|
133 | });
|
134 | };
|
135 | /**
|
136 | * load ./plugins
|
137 | */
|
138 | App.prototype.loadUserLocalPlugins = function () {
|
139 | return tslib_1.__awaiter(this, void 0, void 0, function () {
|
140 | var cwd;
|
141 | return tslib_1.__generator(this, function (_a) {
|
142 | switch (_a.label) {
|
143 | case 0:
|
144 | cwd = path_1.default.join(process.cwd(), this.conf.pluginDir);
|
145 | return [4 /*yield*/, this.loadPluginsByDir(cwd)];
|
146 | case 1:
|
147 | _a.sent();
|
148 | return [2 /*return*/];
|
149 | }
|
150 | });
|
151 | });
|
152 | };
|
153 | /**
|
154 | * loading plugins which install it as a dependence in package.json
|
155 | */
|
156 | App.prototype.loadPlugins = function () {
|
157 | return tslib_1.__awaiter(this, void 0, void 0, function () {
|
158 | var _this = this;
|
159 | var cwdPkg, pkg, deps, npmPlugins, npmPlugins_1, npmPlugins_1_1, dep, cwd, e_2_1, e_2, _a;
|
160 | return tslib_1.__generator(this, function (_b) {
|
161 | switch (_b.label) {
|
162 | case 0:
|
163 | cwdPkg = path_1.default.join(process.cwd(), 'package.json');
|
164 | if (!fs_extra_1.default.existsSync(cwdPkg)) {
|
165 | return [2 /*return*/];
|
166 | }
|
167 | debug('finding npm plugins in %o ', cwdPkg);
|
168 | return [4 /*yield*/, fs_extra_1.default.readJSON(cwdPkg)];
|
169 | case 1:
|
170 | pkg = _b.sent();
|
171 | if (!(pkg.dependencies || pkg.devDependencies)) return [3 /*break*/, 10];
|
172 | deps = tslib_1.__assign({}, pkg.dependencies, pkg.devDependencies);
|
173 | npmPlugins = Object.keys(deps).filter(function (f) { return _this.isPluginFolder(f); });
|
174 | debug('npm plugins: %o', npmPlugins);
|
175 | _b.label = 2;
|
176 | case 2:
|
177 | _b.trys.push([2, 8, 9, 10]);
|
178 | npmPlugins_1 = tslib_1.__values(npmPlugins), npmPlugins_1_1 = npmPlugins_1.next();
|
179 | _b.label = 3;
|
180 | case 3:
|
181 | if (!!npmPlugins_1_1.done) return [3 /*break*/, 7];
|
182 | dep = npmPlugins_1_1.value;
|
183 | cwd = resolve_pkg_1.default(dep);
|
184 | if (!cwd) return [3 /*break*/, 5];
|
185 | return [4 /*yield*/, this.addPlugin(dep, cwd, false)];
|
186 | case 4:
|
187 | _b.sent();
|
188 | return [3 /*break*/, 6];
|
189 | case 5:
|
190 | console.log('can not find %o, make sure you have installed it already', dep);
|
191 | _b.label = 6;
|
192 | case 6:
|
193 | npmPlugins_1_1 = npmPlugins_1.next();
|
194 | return [3 /*break*/, 3];
|
195 | case 7: return [3 /*break*/, 10];
|
196 | case 8:
|
197 | e_2_1 = _b.sent();
|
198 | e_2 = { error: e_2_1 };
|
199 | return [3 /*break*/, 10];
|
200 | case 9:
|
201 | try {
|
202 | if (npmPlugins_1_1 && !npmPlugins_1_1.done && (_a = npmPlugins_1.return)) _a.call(npmPlugins_1);
|
203 | }
|
204 | finally { if (e_2) throw e_2.error; }
|
205 | return [7 /*endfinally*/];
|
206 | case 10: return [2 /*return*/];
|
207 | }
|
208 | });
|
209 | });
|
210 | };
|
211 | App.prototype.loadGlobalPlugins = function () {
|
212 | return tslib_1.__awaiter(this, void 0, void 0, function () {
|
213 | return tslib_1.__generator(this, function (_a) {
|
214 | switch (_a.label) {
|
215 | case 0: return [4 /*yield*/, this.loadPluginsByDir(globalDirs.npm.packages, false)];
|
216 | case 1:
|
217 | _a.sent();
|
218 | return [4 /*yield*/, this.loadPluginsByDir(globalDirs.yarn.packages, false)];
|
219 | case 2:
|
220 | _a.sent();
|
221 | return [2 /*return*/];
|
222 | }
|
223 | });
|
224 | });
|
225 | };
|
226 | /**
|
227 | * install plugins the order is:
|
228 | * - user local plugins
|
229 | * - system local plugins
|
230 | * - plugins
|
231 | */
|
232 | App.prototype.install = function () {
|
233 | return tslib_1.__awaiter(this, void 0, void 0, function () {
|
234 | return tslib_1.__generator(this, function (_a) {
|
235 | switch (_a.label) {
|
236 | case 0: return [4 /*yield*/, this.loadPluginsByDir(path_1.default.join(__dirname, 'plugins'))];
|
237 | case 1:
|
238 | _a.sent();
|
239 | return [4 /*yield*/, this.loadUserLocalPlugins()];
|
240 | case 2:
|
241 | _a.sent();
|
242 | return [4 /*yield*/, this.loadPlugins()];
|
243 | case 3:
|
244 | _a.sent();
|
245 | return [4 /*yield*/, this.loadGlobalPlugins()];
|
246 | case 4:
|
247 | _a.sent();
|
248 | return [2 /*return*/];
|
249 | }
|
250 | });
|
251 | });
|
252 | };
|
253 | /**
|
254 | * run a plugin immediately
|
255 | * @param plugin local plugin for debug
|
256 | * - ./path/to/plugin-entry
|
257 | * - /path/to/plugin-entry
|
258 | * - merry-plugin-awesome-plugin
|
259 | * @param options
|
260 | */
|
261 | App.prototype.debug = function (plugin, options) {
|
262 | return tslib_1.__awaiter(this, void 0, void 0, function () {
|
263 | var p, plug, pkgCwd, Plug;
|
264 | return tslib_1.__generator(this, function (_a) {
|
265 | switch (_a.label) {
|
266 | case 0:
|
267 | debug('isAbsolute: %o', path_1.default.isAbsolute(plugin));
|
268 | if (!(!path_1.default.isAbsolute(plugin) && this.isPluginFolder(plugin))) return [3 /*break*/, 2];
|
269 | return [4 /*yield*/, this.addPlugin(plugin, process.cwd())];
|
270 | case 1:
|
271 | _a.sent();
|
272 | return [3 /*break*/, 3];
|
273 | case 2:
|
274 | plugin = path_1.default.isAbsolute(plugin)
|
275 | ? plugin
|
276 | : path_1.default.join(process.cwd(), plugin);
|
277 | if (fs_extra_1.default.existsSync(plugin)) {
|
278 | try {
|
279 | p = require(plugin);
|
280 | plug = p.default || p;
|
281 | pkgCwd = pkg_up_1.default.sync(plugin);
|
282 | Plug = new plugin_1.Plugin(this.program, this.conf, pkgCwd);
|
283 | plug(Plug);
|
284 | debug('loading plugin at path: %o succeed', pkgCwd);
|
285 | }
|
286 | catch (error) {
|
287 | debug('error: %o', error);
|
288 | }
|
289 | }
|
290 | _a.label = 3;
|
291 | case 3: return [2 /*return*/];
|
292 | }
|
293 | });
|
294 | });
|
295 | };
|
296 | /**
|
297 | * install plugins and run
|
298 | */
|
299 | App.prototype.run = function () {
|
300 | return tslib_1.__awaiter(this, void 0, void 0, function () {
|
301 | var _this = this;
|
302 | return tslib_1.__generator(this, function (_a) {
|
303 | switch (_a.label) {
|
304 | case 0: return [4 /*yield*/, this.install()
|
305 | // only install debug plugin in DEBUG mode
|
306 | ];
|
307 | case 1:
|
308 | _a.sent();
|
309 | // only install debug plugin in DEBUG mode
|
310 | if (!!process.env.DEBUG) {
|
311 | this.program
|
312 | .command('debug [plugin]')
|
313 | .action(function (p, options) {
|
314 | _this.debug(p, options);
|
315 | });
|
316 | }
|
317 | this.program.parse(process.argv);
|
318 | if (!process.argv.slice(2).length) {
|
319 | this.program.outputHelp();
|
320 | }
|
321 | return [2 /*return*/];
|
322 | }
|
323 | });
|
324 | });
|
325 | };
|
326 | return App;
|
327 | }());
|
328 | exports.App = App;
|
329 | exports.default = new App();
|
330 | //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJpbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSw4REFBeUI7QUFDekIsc0RBQXVCO0FBRXZCLDZDQUE0QztBQUM1QywwREFBMEI7QUFDMUIsb0VBQW9DO0FBQ3BDLHVDQUErQztBQUMvQyxJQUFNLEtBQUssR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUE7QUFDMUMsdUNBQThDO0FBQzlDLElBQU0sUUFBUSxHQUFHLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQTtBQUNwQyxJQUFNLFVBQVUsR0FBRyxPQUFPLENBQUMsYUFBYSxDQUFDLENBQUE7QUFDekM7SUFhQztRQUFBLGlCQUdDO1FBUEQ7O1dBRUc7UUFDTyxZQUFPLEdBQVUsRUFBRSxDQUFBO1FBSzdCOztXQUVHO1FBQ0ssbUJBQWMsR0FBRyxVQUFDLE1BQWM7WUFDdkMsT0FBTyxJQUFJLE1BQU0sQ0FBQyxLQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQTtRQUNqRCxDQUFDLENBQUE7UUFSQSxJQUFJLENBQUMsSUFBSSxHQUFHLGdCQUFPLEVBQUUsQ0FBQTtRQUNyQixJQUFJLENBQUMsT0FBTyxHQUFHLHNCQUFVLEVBQUUsQ0FBQTtJQUM1QixDQUFDO0lBT0Q7Ozs7T0FJRztJQUNXLHVCQUFTLEdBQXZCLFVBQXdCLFVBQWtCLEVBQUUsR0FBVyxFQUFFLFNBQWdCO1FBQWhCLDBCQUFBLEVBQUEsZ0JBQWdCOzs7Ozs7d0JBQ3hFLEtBQUssQ0FBQyxzQkFBc0IsRUFBRSxVQUFVLEVBQUUsR0FBRyxDQUFDLENBQUE7d0JBQ3hDLE1BQU0sR0FBRyxnQkFBSyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQTt3QkFDOUIsSUFBSSxDQUFDLE1BQU0sRUFBRTs0QkFDWixzQkFBTTt5QkFDTjs2QkFDRyxTQUFTLEVBQVQsd0JBQVM7d0JB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 |
\ | No newline at end of file |