@@ -2,9 +2,41 @@ import log from "../log";
22import { promises as fs } from "fs" ;
33import path from "path" ;
44import { commands } from "../../../index" ;
5+ import { exec } from "child_process" ;
6+ import util from "util" ;
7+ const execPromise = util . promisify ( exec ) ;
58
69const commandsPath = path . join ( __dirname , ".." , ".." , ".." , "commands" ) ;
710
11+ async function ensureDependencies (
12+ dependencies : { name : string ; version : string } [ ] ,
13+ ) {
14+ for ( const dep of dependencies ) {
15+ try {
16+ require . resolve ( dep . name ) ;
17+ log . info ( "Loader" , `Dependency already installed: ${ dep . name } ` ) ;
18+ } catch {
19+ log . info (
20+ "Loader" ,
21+ `Installing missing dependency: ${ dep . name } @${ dep . version } ` ,
22+ ) ;
23+ try {
24+ const { stdout, stderr } = await execPromise (
25+ `npm install ${ dep . name } @${ dep . version } ` ,
26+ ) ;
27+ if ( stdout ) log . info ( "npm" , stdout ) ;
28+ if ( stderr ) log . error ( "npm" , stderr ) ;
29+ } catch ( err ) {
30+ log . error (
31+ "Loader" ,
32+ `Failed to install ${ dep . name } @${ dep . version } ` ,
33+ err ,
34+ ) ;
35+ }
36+ }
37+ }
38+ }
39+
840export default async function loader ( file : string , customPath ?: string ) {
941 if ( / \. j s $ | \. t s $ / . test ( file ) ) {
1042 const filePath = path . join ( customPath || commandsPath , file ) ;
@@ -21,6 +53,10 @@ export default async function loader(file: string, customPath?: string) {
2153 commandModule . info &&
2254 commandModule . info . command
2355 ) {
56+ if ( Array . isArray ( commandModule . info . dependencies ) ) {
57+ await ensureDependencies ( commandModule . info . dependencies ) ;
58+ }
59+
2460 commands [ commandModule . info . command ] = {
2561 command : commandModule . info . command ,
2662 description : commandModule . info . description || "No description" ,
@@ -41,5 +77,5 @@ export async function mapCommands() {
4177}
4278
4379export function mapCommandsBackground ( ) {
44- mapCommands ( ) . catch ( err => log . error ( "MapCommandLoader" , err ) ) ;
80+ mapCommands ( ) . catch ( ( err ) => log . error ( "MapCommandLoader" , err ) ) ;
4581}
0 commit comments