@@ -24,7 +24,8 @@ import {
24
24
} from '@amzn/codewhisperer-streaming'
25
25
import * as path from 'path'
26
26
import { ServiceException } from '@smithy/smithy-client'
27
- import * as ignoreWalk from 'ignore-walk'
27
+ import { promises as fs } from 'fs'
28
+ import * as fg from 'fast-glob'
28
29
import { getAuthFollowUpType } from '../language-server/chat/utils'
29
30
import ignore = require( 'ignore' )
30
31
import { InitializeParams } from '@aws/language-server-runtimes/server-interface'
@@ -493,36 +494,54 @@ export function hasConnectionExpired(error: any) {
493
494
}
494
495
495
496
/**
496
- Lists files in a directory while respecting . gitignore.
497
+ Lists files in a directory respecting gitignore and npmignore rules .
497
498
@param directory The absolute path of root directory.
498
- @param limit The maximum number of files to return.
499
499
@returns A promise that resolves to an array of absolute file paths.
500
500
*/
501
501
export async function listFilesWithGitignore ( directory : string ) : Promise < string [ ] > {
502
- const commonIgnore = ignore ( ) . add ( COMMON_GITIGNORE_PATTERNS )
502
+ let ignorePatterns : string [ ] = [ ... COMMON_GITIGNORE_PATTERNS ]
503
503
504
+ // Process .gitignore
505
+ const gitignorePath = path . join ( directory , '.gitignore' )
504
506
try {
505
- let ignoreWalkFiles = await ignoreWalk ( {
506
- path : directory ,
507
- // Use multiple ignore files
508
- ignoreFiles : [ '.gitignore' , '.npmignore' ] ,
509
- // Additional options
510
- follow : false , // follow symlinks
511
- includeEmpty : false , // exclude empty directories
512
- } )
513
- // hard limit of 500k files to avoid hitting memory limit
514
- ignoreWalkFiles = ignoreWalkFiles . slice ( 0 , 500_000 )
515
-
516
- // apply common gitignore in case some build system like Brazil
517
- // generates a lot of temp files that is not in Gitignore.
518
- ignoreWalkFiles = commonIgnore . filter ( ignoreWalkFiles )
519
-
520
- const absolutePaths = ignoreWalkFiles . map ( file => path . join ( directory , file ) )
521
- return absolutePaths
522
- } catch ( error ) {
523
- console . error ( 'Error gathering files:' , error )
524
- return [ ]
507
+ const gitignoreContent = await fs . readFile ( gitignorePath , { encoding : 'utf8' } )
508
+ ignorePatterns = ignorePatterns . concat (
509
+ gitignoreContent
510
+ . split ( '\n' )
511
+ . map ( line => line . trim ( ) )
512
+ . filter ( line => line && ! line . startsWith ( '#' ) )
513
+ )
514
+ } catch ( err : any ) {
515
+ if ( err . code !== 'ENOENT' ) {
516
+ console . log ( 'Preindexing walk: gitIgnore file could not be read' , err )
517
+ }
525
518
}
519
+
520
+ // Process .npmignore
521
+ const npmignorePath = path . join ( directory , '.npmignore' )
522
+ try {
523
+ const npmignoreContent = await fs . readFile ( npmignorePath , { encoding : 'utf8' } )
524
+ ignorePatterns = ignorePatterns . concat (
525
+ npmignoreContent
526
+ . split ( '\n' )
527
+ . map ( line => line . trim ( ) )
528
+ . filter ( line => line && ! line . startsWith ( '#' ) )
529
+ )
530
+ } catch ( err : any ) {
531
+ if ( err . code !== 'ENOENT' ) {
532
+ console . log ( 'Preindexing walk: npmIgnore file could not be read' , err )
533
+ }
534
+ }
535
+
536
+ const absolutePaths = await fg ( [ '**/*' ] , {
537
+ cwd : directory ,
538
+ dot : true ,
539
+ ignore : ignorePatterns ,
540
+ onlyFiles : false ,
541
+ followSymbolicLinks : false ,
542
+ absolute : true ,
543
+ } )
544
+ return absolutePaths . slice ( 0 , 500_000 )
526
545
}
527
546
528
547
export function getFileExtensionName ( filepath : string ) : string {
0 commit comments