@@ -51,6 +51,11 @@ export class NpmPackageManager extends BasePackageManager {
5151 return { command : 'run' , args : [ command , ...args ] } ;
5252 }
5353
54+ // Handle dev dependencies for install command
55+ if ( command === 'install' && options ?. dev ) {
56+ return { command : 'install' , args : [ '--save-dev' , ...args ] } ;
57+ }
58+
5459 return { command, args } ;
5560 }
5661
@@ -89,8 +94,17 @@ export class YarnPackageManager extends BasePackageManager {
8994 } ) ;
9095 }
9196
92- mapCommand ( command : string , args : string [ ] ) : { command : string ; args : string [ ] } {
97+ mapCommand ( command : string , args : string [ ] , options ?: any ) : { command : string ; args : string [ ] } {
98+ // Handle script commands
99+ if ( options ?. hasScript && ! [ 'install' , 'add' , 'remove' , 'uninstall' , 'update' , 'upgrade' ] . includes ( command ) ) {
100+ return { command, args } ;
101+ }
102+
93103 if ( command === 'install' && args . length > 0 ) {
104+ // Handle dev dependencies
105+ if ( options ?. dev ) {
106+ return { command : 'add' , args : [ '--dev' , ...args ] } ;
107+ }
94108 return { command : 'add' , args } ;
95109 }
96110 if ( command === 'uninstall' ) {
@@ -138,8 +152,17 @@ export class PnpmPackageManager extends BasePackageManager {
138152 } ) ;
139153 }
140154
141- mapCommand ( command : string , args : string [ ] ) : { command : string ; args : string [ ] } {
155+ mapCommand ( command : string , args : string [ ] , options ?: any ) : { command : string ; args : string [ ] } {
156+ // Handle script commands
157+ if ( options ?. hasScript && ! [ 'install' , 'add' , 'remove' , 'uninstall' , 'update' ] . includes ( command ) ) {
158+ return { command, args } ;
159+ }
160+
142161 if ( command === 'install' && args . length > 0 ) {
162+ // Handle dev dependencies
163+ if ( options ?. dev ) {
164+ return { command : 'add' , args : [ '--save-dev' , ...args ] } ;
165+ }
143166 return { command : 'add' , args } ;
144167 }
145168 if ( command === 'uninstall' ) {
@@ -183,8 +206,18 @@ export class BunPackageManager extends BasePackageManager {
183206 } ) ;
184207 }
185208
186- mapCommand ( command : string , args : string [ ] ) : { command : string ; args : string [ ] } {
209+ mapCommand ( command : string , args : string [ ] , options ?: any ) : { command : string ; args : string [ ] } {
210+ // Handle script commands - if it's a script in package.json, use 'run' prefix
211+ // This includes Bun's built-in commands (test, build, update) when they're defined as scripts
212+ if ( options ?. hasScript && ! [ 'install' , 'add' , 'remove' , 'uninstall' , 'exec' ] . includes ( command ) ) {
213+ return { command : 'run' , args : [ command , ...args ] } ;
214+ }
215+
187216 if ( command === 'install' && args . length > 0 ) {
217+ // Handle dev dependencies
218+ if ( options ?. dev ) {
219+ return { command : 'add' , args : [ '-d' , ...args ] } ;
220+ }
188221 return { command : 'add' , args } ;
189222 }
190223 if ( command === 'uninstall' ) {
@@ -194,10 +227,7 @@ export class BunPackageManager extends BasePackageManager {
194227 return { command : 'run' , args } ;
195228 }
196229
197- const devFlags = [ '-D' , '--save-dev' , '--dev' ] ;
198- const mappedArgs = args . map ( arg => devFlags . includes ( arg ) ? '-d' : arg ) ;
199-
200- return { command, args : mappedArgs } ;
230+ return { command, args } ;
201231 }
202232
203233 detectVersion ( cwd : string ) : string | undefined {
@@ -208,4 +238,81 @@ export class BunPackageManager extends BasePackageManager {
208238 return undefined ;
209239 }
210240 }
241+ }
242+
243+ const DENO_JSON = {
244+ name : 'deno.json' ,
245+ parse : ( content : string ) => {
246+ const jsonWithComments = content . replace ( / \/ \/ .* $ / gm, '' ) . replace ( / \/ \* [ \s \S ] * ?\* \/ / gm, '' ) ;
247+ return JSON . parse ( jsonWithComments ) ;
248+ } ,
249+ stringify : ( data : any ) => JSON . stringify ( data , null , 2 )
250+ } ;
251+
252+ export class DenoPackageManager extends BasePackageManager {
253+ constructor ( ) {
254+ super ( {
255+ name : 'deno' ,
256+ ecosystem : 'javascript' ,
257+ packageFile : DENO_JSON ,
258+ lockFile : { names : [ 'deno.lock' ] } ,
259+ commands : {
260+ install : 'install' ,
261+ add : 'add' ,
262+ installDev : 'add --dev' ,
263+ remove : 'remove' ,
264+ update : 'update' ,
265+ list : 'info' ,
266+ outdated : 'outdated' ,
267+ run : 'task' ,
268+ exec : 'run' ,
269+ ci : 'install' ,
270+ globalFlag : '--global'
271+ } ,
272+ installDir : 'node_modules' ,
273+ detectFiles : [ 'deno.json' , 'deno.jsonc' ] ,
274+ workspaceSupport : true ,
275+ workspaceConfigFiles : [ 'deno.json' , 'deno.jsonc' ]
276+ } ) ;
277+ }
278+
279+ mapCommand ( command : string , args : string [ ] , options ?: any ) : { command : string ; args : string [ ] } {
280+ // Handle script commands - Deno uses 'task' for scripts
281+ if ( options ?. hasScript && ! [ 'install' , 'add' , 'remove' , 'uninstall' , 'update' , 'exec' ] . includes ( command ) ) {
282+ return { command : 'task' , args : [ command , ...args ] } ;
283+ }
284+
285+ if ( command === 'install' && args . length > 0 ) {
286+ // Handle dev dependencies
287+ if ( options ?. dev ) {
288+ return { command : 'add' , args : [ '--dev' , ...args ] } ;
289+ }
290+ return { command : 'add' , args } ;
291+ }
292+ if ( command === 'uninstall' ) {
293+ return { command : 'remove' , args } ;
294+ }
295+ if ( command === 'run' && args . length > 0 ) {
296+ return { command : 'task' , args } ;
297+ }
298+ if ( command === 'exec' ) {
299+ return { command : 'run' , args } ;
300+ }
301+
302+ return { command, args } ;
303+ }
304+
305+ detectVersion ( cwd : string ) : string | undefined {
306+ try {
307+ const result = spawnSync ( 'deno' , [ '--version' ] , { cwd, encoding : 'utf8' } ) ;
308+ const output = result . stdout ?. trim ( ) ;
309+ if ( output ) {
310+ const match = output . match ( / d e n o ( [ \d . ] + ) / i) ;
311+ return match ? match [ 1 ] : undefined ;
312+ }
313+ return undefined ;
314+ } catch {
315+ return undefined ;
316+ }
317+ }
211318}
0 commit comments