@node-cli/search 1.2.1 → 1.2.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/core.d.ts CHANGED
@@ -38,6 +38,7 @@ export declare class Search {
38
38
  ignoreFolders(directory: string): boolean;
39
39
  shouldIgnoreFile(filePath: string): boolean;
40
40
  filterHidden(value: string[] | string): boolean;
41
+ isBinaryFileExtension(filePath: string): boolean;
41
42
  start(returnResults?: boolean): Promise<string>;
42
43
  scanFileSystem(nodes: string[]): Promise<void>;
43
44
  readFileContent(filePath: string): Promise<string>;
package/dist/core.js CHANGED
@@ -79,6 +79,70 @@ export class Search {
79
79
  }
80
80
  return value[0] !== ".";
81
81
  }
82
+ isBinaryFileExtension(filePath) {
83
+ const ext = extname(filePath).toLowerCase().replace(/^\./, "");
84
+ // If there's no extension, assume it's binary
85
+ /* istanbul ignore if */ if (!ext) {
86
+ return true;
87
+ }
88
+ const binaryExtensions = [
89
+ // Executables and compiled code
90
+ "exe",
91
+ "dll",
92
+ "so",
93
+ "dylib",
94
+ "bin",
95
+ "obj",
96
+ "o",
97
+ // Compressed files
98
+ "zip",
99
+ "tar",
100
+ "gz",
101
+ "rar",
102
+ "7z",
103
+ "jar",
104
+ "war",
105
+ // Media files
106
+ "jpg",
107
+ "jpeg",
108
+ "png",
109
+ "gif",
110
+ "bmp",
111
+ "ico",
112
+ "tif",
113
+ "tiff",
114
+ "mp3",
115
+ "mp4",
116
+ "avi",
117
+ "mov",
118
+ "wmv",
119
+ "flv",
120
+ "wav",
121
+ "ogg",
122
+ // Document formats
123
+ "pdf",
124
+ "doc",
125
+ "docx",
126
+ "xls",
127
+ "xlsx",
128
+ "ppt",
129
+ "pptx",
130
+ // Database files
131
+ "db",
132
+ "sqlite",
133
+ "mdb",
134
+ // Other binary formats
135
+ "class",
136
+ "pyc",
137
+ "pyd",
138
+ "pyo",
139
+ "woff",
140
+ "woff2",
141
+ "ttf",
142
+ "otf"
143
+ ];
144
+ return binaryExtensions.includes(ext);
145
+ }
82
146
  async start(returnResults = false) {
83
147
  if (this.displayStats) {
84
148
  perf.start();
@@ -160,6 +224,10 @@ export class Search {
160
224
  }
161
225
  async readFileContent(filePath) {
162
226
  try {
227
+ // Check if it's a known binary extension
228
+ /* istanbul ignore if */ if (this.isBinaryFileExtension(filePath)) {
229
+ return "[Binary file]";
230
+ }
163
231
  const content = await readFileAsync(filePath, "utf8");
164
232
  return content;
165
233
  } catch (error) {
package/dist/core.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/core.ts"],"sourcesContent":["import { basename, extname, join, relative } from \"node:path\";\nimport { GitIgnoreHandler } from \"./gitIgnoreHandler.js\";\nimport {\n\tSTR_TYPE_BOTH,\n\tSTR_TYPE_DIRECTORY,\n\tSTR_TYPE_FILE,\n\tcheckPattern,\n\tformatLongListings,\n\tprintStatistics,\n\trunCommandOnNode,\n\trunGrepOnNode,\n} from \"./utilities.js\";\n\nimport { promisify } from \"node:util\";\nimport { Logger } from \"@node-cli/logger\";\nimport { Performance } from \"@node-cli/perf\";\nimport fs from \"fs-extra\";\nimport kleur from \"kleur\";\nimport plur from \"plur\";\n\nconst lstatAsync = promisify(fs.lstat);\nconst readdirAsync = promisify(fs.readdir);\nconst readFileAsync = promisify(fs.readFile);\nconst perf = new Performance();\nconst logger = new Logger({\n\tboring: process.env.NODE_ENV === \"test\",\n});\n\nexport class Search {\n\tboring?: boolean;\n\tcommand?: string;\n\tdisplayHiddenFilesAndFolders?: boolean;\n\tdisplayLongListing?: boolean;\n\tdisplayStats?: boolean;\n\tfoldersBlacklist?: RegExp;\n\tgrep?: RegExp;\n\tnodesList?: any[];\n\tpath?: string;\n\trePattern?: RegExp;\n\ttotalDirFound?: number;\n\ttotalDirScanned?: number;\n\ttotalFileFound?: number;\n\ttotalFileScanned?: number;\n\ttype?: string;\n\tignoreExtensions?: string[];\n\tprintMode?: string;\n\tgitIgnoreHandler: GitIgnoreHandler;\n\tignoreGitIgnore?: boolean;\n\n\tconstructor({\n\t\tboring,\n\t\tcommand,\n\t\tdot,\n\t\tfoldersBlacklist,\n\t\tgrep,\n\t\tignoreCase,\n\t\tshort,\n\t\tpath,\n\t\tpattern,\n\t\tstats,\n\t\ttype,\n\t\tignore,\n\t\tprintMode,\n\t\tignoreGitIgnore,\n\t}: {\n\t\tboring?: boolean;\n\t\tcommand?: string;\n\t\tdot?: boolean;\n\t\tfoldersBlacklist?: RegExp;\n\t\tgrep?: string | RegExp;\n\t\tignoreCase?: boolean;\n\t\tshort?: boolean;\n\t\tpath?: string;\n\t\tpattern?: string;\n\t\tstats?: boolean;\n\t\ttype?: string;\n\t\tignore?: string[];\n\t\tprintMode?: string;\n\t\tignoreGitIgnore?: boolean;\n\t}) {\n\t\tthis.path = path;\n\t\tthis.rePattern = pattern\n\t\t\t? new RegExp(pattern, ignoreCase ? \"i\" : \"\")\n\t\t\t: undefined;\n\t\tthis.type = type || STR_TYPE_BOTH;\n\t\tthis.boring = boring;\n\t\tkleur.enabled = !boring;\n\t\tthis.displayLongListing = !short;\n\t\tthis.displayStats = stats;\n\t\tthis.displayHiddenFilesAndFolders = dot;\n\t\tthis.nodesList = [];\n\t\tthis.foldersBlacklist = foldersBlacklist;\n\t\tthis.totalDirScanned = 0;\n\t\tthis.totalFileScanned = 0;\n\t\tthis.totalDirFound = 0;\n\t\tthis.totalFileFound = 0;\n\t\tthis.command = command ? command.trim() : undefined;\n\t\tthis.ignoreExtensions = ignore.map((ext) => ext.toLowerCase());\n\t\tthis.printMode = printMode;\n\t\tthis.ignoreGitIgnore = ignoreGitIgnore;\n\t\tthis.gitIgnoreHandler = new GitIgnoreHandler();\n\t\ttry {\n\t\t\tthis.grep = grep ? new RegExp(grep, ignoreCase ? \"gi\" : \"g\") : undefined;\n\t\t} catch (error) {\n\t\t\tlogger.error(error);\n\t\t\t// eslint-disable-next-line unicorn/no-process-exit\n\t\t\tprocess.exit(1);\n\t\t}\n\t}\n\n\tignoreFolders(directory: string) {\n\t\tthis.foldersBlacklist.lastIndex = 0;\n\t\treturn this.foldersBlacklist.test(basename(directory));\n\t}\n\n\tshouldIgnoreFile(filePath: string) {\n\t\tif (!this.ignoreExtensions || this.ignoreExtensions.length === 0) {\n\t\t\treturn false;\n\t\t}\n\n\t\tconst extension = extname(filePath).toLowerCase().replace(/^\\./, \"\");\n\t\treturn this.ignoreExtensions.includes(extension);\n\t}\n\n\tfilterHidden(value: string[] | string) {\n\t\tif (this.displayHiddenFilesAndFolders) {\n\t\t\treturn true;\n\t\t}\n\t\treturn value[0] !== \".\";\n\t}\n\n\tasync start(returnResults = false) {\n\t\tif (this.displayStats) {\n\t\t\tperf.start();\n\t\t}\n\t\tawait this.scanFileSystem([this.path]);\n\t\tconst results = await this.postProcessResults(returnResults);\n\n\t\tif (this.displayStats) {\n\t\t\tperf.stop();\n\t\t\tprintStatistics({\n\t\t\t\tduration: perf.results.duration,\n\t\t\t\tgrep: this.grep,\n\t\t\t\tpattern: this.rePattern,\n\t\t\t\ttotalDirScanned: this.totalDirScanned,\n\t\t\t\ttotalDirsFound: this.totalDirFound,\n\t\t\t\ttotalFileScanned: this.totalFileScanned,\n\t\t\t\ttotalFilesFound: this.totalFileFound,\n\t\t\t\ttype: this.type,\n\t\t\t});\n\t\t}\n\t\treturn returnResults ? results : undefined;\n\t}\n\n\tasync scanFileSystem(nodes: string[]) {\n\t\tfor (const node of nodes) {\n\t\t\tlet result: boolean | RegExpExecArray,\n\t\t\t\tfiles: string[],\n\t\t\t\tshortname: string,\n\t\t\t\tstat: fs.Stats;\n\t\t\ttry {\n\t\t\t\tstat = await lstatAsync(node);\n\t\t\t} catch {\n\t\t\t\t// ignore read permission denied errors silently...\n\t\t\t}\n\n\t\t\tconst isDirectory = stat && stat.isDirectory();\n\t\t\tconst isFile = stat && stat.isFile();\n\n\t\t\t// Add this check to respect .gitignore patterns\n\t\t\tif (await this.shouldIgnoreByGitIgnore(node, isDirectory)) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (isDirectory && !this.ignoreFolders(node)) {\n\t\t\t\tthis.totalDirScanned++;\n\n\t\t\t\tresult = checkPattern(this.rePattern, node);\n\t\t\t\tif (result) {\n\t\t\t\t\tthis.totalDirFound++;\n\t\t\t\t\tthis.nodesList.push({\n\t\t\t\t\t\tcommand: this.command,\n\t\t\t\t\t\tmatch: result,\n\t\t\t\t\t\tname: node,\n\t\t\t\t\t\tstat,\n\t\t\t\t\t\ttype: STR_TYPE_DIRECTORY,\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\ttry {\n\t\t\t\t\tfiles = await readdirAsync(node);\n\t\t\t\t\tawait this.scanFileSystem(\n\t\t\t\t\t\tfiles\n\t\t\t\t\t\t\t.filter((element) => this.filterHidden(element))\n\t\t\t\t\t\t\t.map(function (file) {\n\t\t\t\t\t\t\t\treturn join(node, file);\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t);\n\t\t\t\t} catch {\n\t\t\t\t\t// nothing to declare\n\t\t\t\t}\n\t\t\t} else if (isFile) {\n\t\t\t\t// Skip files with ignored extensions\n\t\t\t\tif (this.shouldIgnoreFile(node)) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tthis.totalFileScanned++;\n\t\t\t\tshortname = basename(node);\n\t\t\t\tconst patternResult = checkPattern(this.rePattern, shortname);\n\t\t\t\tif (patternResult) {\n\t\t\t\t\tthis.totalFileFound++;\n\t\t\t\t\tthis.nodesList.push({\n\t\t\t\t\t\tcommand: this.command,\n\t\t\t\t\t\tmatch: patternResult[0],\n\t\t\t\t\t\tname: node,\n\t\t\t\t\t\tstat,\n\t\t\t\t\t\ttype: STR_TYPE_FILE,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tasync readFileContent(filePath: string): Promise<string> {\n\t\ttry {\n\t\t\tconst content = await readFileAsync(filePath, \"utf8\");\n\t\t\treturn content;\n\t\t} catch (error) {\n\t\t\t/* istanbul ignore next */\n\t\t\treturn `Error reading file: ${error.message}`;\n\t\t}\n\t}\n\n\tasync printFilesContent(returnResults: boolean) {\n\t\tconst fileNodes = this.nodesList.filter(\n\t\t\t(node) => node.type === STR_TYPE_FILE,\n\t\t);\n\n\t\tlet results = \"\";\n\t\tif (this.printMode === \"simple\") {\n\t\t\tfor (const node of fileNodes) {\n\t\t\t\tconst relativePath = relative(this.path, node.name);\n\t\t\t\tif (returnResults) {\n\t\t\t\t\tresults += `---\\n./${relativePath}\\n---\\n`;\n\t\t\t\t} else {\n\t\t\t\t\tlogger.log(`---\\n./${relativePath}\\n---`);\n\t\t\t\t}\n\t\t\t\tconst content = await this.readFileContent(node.name);\n\t\t\t\tif (returnResults) {\n\t\t\t\t\tresults += `${content}\\n`;\n\t\t\t\t} else {\n\t\t\t\t\tlogger.log(content);\n\t\t\t\t}\n\t\t\t\t// adding a new line after each file content except the last one\n\t\t\t\tif (node !== fileNodes[fileNodes.length - 1]) {\n\t\t\t\t\tif (returnResults) {\n\t\t\t\t\t\tresults += \"\\n\";\n\t\t\t\t\t} else {\n\t\t\t\t\t\tlogger.log(\"\");\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t} else if (this.printMode === \"xml\") {\n\t\t\tif (returnResults) {\n\t\t\t\tresults += \"<documents>\\n\";\n\t\t\t} else {\n\t\t\t\tlogger.log(\"<documents>\");\n\t\t\t}\n\n\t\t\tfor (let i = 0; i < fileNodes.length; i++) {\n\t\t\t\tconst node = fileNodes[i];\n\t\t\t\tconst relativePath = relative(this.path, node.name);\n\t\t\t\tconst content = await this.readFileContent(node.name);\n\n\t\t\t\tif (returnResults) {\n\t\t\t\t\tresults += `<document index=\"${i + 1}\">\\n`;\n\t\t\t\t\tresults += `<source>./${relativePath}</source>\\n`;\n\t\t\t\t\tresults += \"<document_content>\\n\";\n\t\t\t\t\tresults += `${content}\\n`;\n\t\t\t\t\tresults += \"</document_content>\\n\";\n\t\t\t\t\tresults += \"</document>\\n\";\n\t\t\t\t} else {\n\t\t\t\t\tlogger.log(`<document index=\"${i + 1}\">`);\n\t\t\t\t\tlogger.log(`<source>./${relativePath}</source>`);\n\t\t\t\t\tlogger.log(\"<document_content>\");\n\t\t\t\t\tlogger.log(content);\n\t\t\t\t\tlogger.log(\"</document_content>\");\n\t\t\t\t\tlogger.log(\"</document>\");\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (returnResults) {\n\t\t\t\tresults += \"</documents>\";\n\t\t\t} else {\n\t\t\t\tlogger.log(\"</documents>\");\n\t\t\t}\n\t\t}\n\t\treturn results;\n\t}\n\n\tasync shouldIgnoreByGitIgnore(\n\t\tnodePath: string,\n\t\tisDirectory: boolean,\n\t): Promise<boolean> {\n\t\t/* istanbul ignore if */\n\t\tif (this.ignoreGitIgnore) {\n\t\t\treturn false;\n\t\t}\n\t\treturn this.gitIgnoreHandler.isIgnored(nodePath, isDirectory);\n\t}\n\n\tasync postProcessResults(returnResults: boolean) {\n\t\t/* istanbul ignore if */\n\t\tif (!this.boring) {\n\t\t\tlogger.log();\n\t\t}\n\n\t\tif (this.grep) {\n\t\t\t/**\n\t\t\t * Resetting the number of files found, since we want to\n\t\t\t * show how many matched the grep, not how many matched the\n\t\t\t * pattern (in the file name).\n\t\t\t */\n\t\t\tthis.totalFileFound = 0;\n\t\t}\n\n\t\t// If printMode is enabled, handle file content printing and return\n\t\tif (this.printMode && [\"simple\", \"xml\"].includes(this.printMode)) {\n\t\t\treturn await this.printFilesContent(returnResults);\n\t\t}\n\n\t\tfor (const node of this.nodesList) {\n\t\t\tif (\n\t\t\t\t(this.type === STR_TYPE_FILE && node.type === STR_TYPE_FILE) ||\n\t\t\t\t(this.type === STR_TYPE_DIRECTORY &&\n\t\t\t\t\tnode.type === STR_TYPE_DIRECTORY) ||\n\t\t\t\tthis.type === STR_TYPE_BOTH\n\t\t\t) {\n\t\t\t\tlet list: {\n\t\t\t\t\t\tgroup?: string;\n\t\t\t\t\t\tmdate?: string;\n\t\t\t\t\t\tmode?: string;\n\t\t\t\t\t\towner?: string;\n\t\t\t\t\t\tsize?: string;\n\t\t\t\t\t} = {\n\t\t\t\t\t\tgroup: \"\",\n\t\t\t\t\t\tmdate: \"\",\n\t\t\t\t\t\tmode: \"\",\n\t\t\t\t\t\towner: \"\",\n\t\t\t\t\t\tsize: \"\",\n\t\t\t\t\t},\n\t\t\t\t\tname: string,\n\t\t\t\t\tseparator: string = \"\";\n\n\t\t\t\t/* istanbul ignore if */\n\t\t\t\tif (this.displayLongListing) {\n\t\t\t\t\tlist = await formatLongListings(node.stat, node.type);\n\t\t\t\t\tseparator = \"\\t\";\n\t\t\t\t}\n\n\t\t\t\tconst color = node.type === STR_TYPE_FILE ? kleur.gray : kleur.blue;\n\t\t\t\tname = relative(this.path, node.name);\n\n\t\t\t\tif (node.match) {\n\t\t\t\t\tconst matchStr = String(node.match); // Ensure match is a string\n\t\t\t\t\tconst match = new RegExp(matchStr, \"g\");\n\t\t\t\t\tconst highlightedMatch = kleur.black().bgYellow(matchStr);\n\t\t\t\t\tname = color(name.replace(match, highlightedMatch));\n\t\t\t\t} else {\n\t\t\t\t\tname = color(name);\n\t\t\t\t}\n\n\t\t\t\tif (this.grep && node.type === STR_TYPE_FILE) {\n\t\t\t\t\tconst { totalMatchingLines, results } = await runGrepOnNode(\n\t\t\t\t\t\tnode.name,\n\t\t\t\t\t\tthis.grep,\n\t\t\t\t\t);\n\t\t\t\t\t/* istanbul ignore else */\n\t\t\t\t\tif (totalMatchingLines) {\n\t\t\t\t\t\tthis.totalFileFound++;\n\t\t\t\t\t\tconst occurrences = plur(\"occurrence\", totalMatchingLines);\n\n\t\t\t\t\t\tlogger.log(\n\t\t\t\t\t\t\t` %s${separator}%s${separator}%s${separator}%s${separator}%s`,\n\t\t\t\t\t\t\tlist.mode.trim(),\n\t\t\t\t\t\t\tlist.owner.trim(),\n\t\t\t\t\t\t\tlist.size.trim(),\n\t\t\t\t\t\t\tlist.mdate,\n\t\t\t\t\t\t\tname,\n\t\t\t\t\t\t\t`(${kleur.white(totalMatchingLines)} ${occurrences})`,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tlogger.log(`${results.join(\"\\n\")}\\n`);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t/* istanbul ignore next */\n\t\t\t\t\tif (!this.grep) {\n\t\t\t\t\t\tlogger.log(\n\t\t\t\t\t\t\t` %s${separator}%s${separator}%s${separator}%s${separator}%s`,\n\t\t\t\t\t\t\tlist.mode.trim(),\n\t\t\t\t\t\t\tlist.owner.trim(),\n\t\t\t\t\t\t\tlist.size.trim(),\n\t\t\t\t\t\t\tlist.mdate,\n\t\t\t\t\t\t\tname,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tif (node.command) {\n\t\t\t\t\t\t\tawait runCommandOnNode(node.name, node.command);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n"],"names":["basename","extname","join","relative","GitIgnoreHandler","STR_TYPE_BOTH","STR_TYPE_DIRECTORY","STR_TYPE_FILE","checkPattern","formatLongListings","printStatistics","runCommandOnNode","runGrepOnNode","promisify","Logger","Performance","fs","kleur","plur","lstatAsync","lstat","readdirAsync","readdir","readFileAsync","readFile","perf","logger","boring","process","env","NODE_ENV","Search","command","displayHiddenFilesAndFolders","displayLongListing","displayStats","foldersBlacklist","grep","nodesList","path","rePattern","totalDirFound","totalDirScanned","totalFileFound","totalFileScanned","type","ignoreExtensions","printMode","gitIgnoreHandler","ignoreGitIgnore","constructor","dot","ignoreCase","short","pattern","stats","ignore","RegExp","undefined","enabled","trim","map","ext","toLowerCase","error","exit","ignoreFolders","directory","lastIndex","test","shouldIgnoreFile","filePath","length","extension","replace","includes","filterHidden","value","start","returnResults","scanFileSystem","results","postProcessResults","stop","duration","totalDirsFound","totalFilesFound","nodes","node","result","files","shortname","stat","isDirectory","isFile","shouldIgnoreByGitIgnore","push","match","name","filter","element","file","patternResult","readFileContent","content","message","printFilesContent","fileNodes","relativePath","log","i","nodePath","isIgnored","list","group","mdate","mode","owner","size","separator","color","gray","blue","matchStr","String","highlightedMatch","black","bgYellow","totalMatchingLines","occurrences","white"],"mappings":"AAAA,SAASA,QAAQ,EAAEC,OAAO,EAAEC,IAAI,EAAEC,QAAQ,QAAQ,YAAY;AAC9D,SAASC,gBAAgB,QAAQ,wBAAwB;AACzD,SACCC,aAAa,EACbC,kBAAkB,EAClBC,aAAa,EACbC,YAAY,EACZC,kBAAkB,EAClBC,eAAe,EACfC,gBAAgB,EAChBC,aAAa,QACP,iBAAiB;AAExB,SAASC,SAAS,QAAQ,YAAY;AACtC,SAASC,MAAM,QAAQ,mBAAmB;AAC1C,SAASC,WAAW,QAAQ,iBAAiB;AAC7C,OAAOC,QAAQ,WAAW;AAC1B,OAAOC,WAAW,QAAQ;AAC1B,OAAOC,UAAU,OAAO;AAExB,MAAMC,aAAaN,UAAUG,GAAGI,KAAK;AACrC,MAAMC,eAAeR,UAAUG,GAAGM,OAAO;AACzC,MAAMC,gBAAgBV,UAAUG,GAAGQ,QAAQ;AAC3C,MAAMC,OAAO,IAAIV;AACjB,MAAMW,SAAS,IAAIZ,OAAO;IACzBa,QAAQC,QAAQC,GAAG,CAACC,QAAQ,KAAK;AAClC;AAEA,OAAO,MAAMC;IACZJ,OAAiB;IACjBK,QAAiB;IACjBC,6BAAuC;IACvCC,mBAA6B;IAC7BC,aAAuB;IACvBC,iBAA0B;IAC1BC,KAAc;IACdC,UAAkB;IAClBC,KAAc;IACdC,UAAmB;IACnBC,cAAuB;IACvBC,gBAAyB;IACzBC,eAAwB;IACxBC,iBAA0B;IAC1BC,KAAc;IACdC,iBAA4B;IAC5BC,UAAmB;IACnBC,iBAAmC;IACnCC,gBAA0B;IAE1BC,YAAY,EACXvB,MAAM,EACNK,OAAO,EACPmB,GAAG,EACHf,gBAAgB,EAChBC,IAAI,EACJe,UAAU,EACVC,KAAK,EACLd,IAAI,EACJe,OAAO,EACPC,KAAK,EACLV,IAAI,EACJW,MAAM,EACNT,SAAS,EACTE,eAAe,EAgBf,CAAE;QACF,IAAI,CAACV,IAAI,GAAGA;QACZ,IAAI,CAACC,SAAS,GAAGc,UACd,IAAIG,OAAOH,SAASF,aAAa,MAAM,MACvCM;QACH,IAAI,CAACb,IAAI,GAAGA,QAAQxC;QACpB,IAAI,CAACsB,MAAM,GAAGA;QACdV,MAAM0C,OAAO,GAAG,CAAChC;QACjB,IAAI,CAACO,kBAAkB,GAAG,CAACmB;QAC3B,IAAI,CAAClB,YAAY,GAAGoB;QACpB,IAAI,CAACtB,4BAA4B,GAAGkB;QACpC,IAAI,CAACb,SAAS,GAAG,EAAE;QACnB,IAAI,CAACF,gBAAgB,GAAGA;QACxB,IAAI,CAACM,eAAe,GAAG;QACvB,IAAI,CAACE,gBAAgB,GAAG;QACxB,IAAI,CAACH,aAAa,GAAG;QACrB,IAAI,CAACE,cAAc,GAAG;QACtB,IAAI,CAACX,OAAO,GAAGA,UAAUA,QAAQ4B,IAAI,KAAKF;QAC1C,IAAI,CAACZ,gBAAgB,GAAGU,OAAOK,GAAG,CAAC,CAACC,MAAQA,IAAIC,WAAW;QAC3D,IAAI,CAAChB,SAAS,GAAGA;QACjB,IAAI,CAACE,eAAe,GAAGA;QACvB,IAAI,CAACD,gBAAgB,GAAG,IAAI5C;QAC5B,IAAI;YACH,IAAI,CAACiC,IAAI,GAAGA,OAAO,IAAIoB,OAAOpB,MAAMe,aAAa,OAAO,OAAOM;QAChE,EAAE,OAAOM,OAAO;YACftC,OAAOsC,KAAK,CAACA;YACb,mDAAmD;YACnDpC,QAAQqC,IAAI,CAAC;QACd;IACD;IAEAC,cAAcC,SAAiB,EAAE;QAChC,IAAI,CAAC/B,gBAAgB,CAACgC,SAAS,GAAG;QAClC,OAAO,IAAI,CAAChC,gBAAgB,CAACiC,IAAI,CAACrE,SAASmE;IAC5C;IAEAG,iBAAiBC,QAAgB,EAAE;QAClC,IAAI,CAAC,IAAI,CAACzB,gBAAgB,IAAI,IAAI,CAACA,gBAAgB,CAAC0B,MAAM,KAAK,GAAG;YACjE,OAAO;QACR;QAEA,MAAMC,YAAYxE,QAAQsE,UAAUR,WAAW,GAAGW,OAAO,CAAC,OAAO;QACjE,OAAO,IAAI,CAAC5B,gBAAgB,CAAC6B,QAAQ,CAACF;IACvC;IAEAG,aAAaC,KAAwB,EAAE;QACtC,IAAI,IAAI,CAAC5C,4BAA4B,EAAE;YACtC,OAAO;QACR;QACA,OAAO4C,KAAK,CAAC,EAAE,KAAK;IACrB;IAEA,MAAMC,MAAMC,gBAAgB,KAAK,EAAE;QAClC,IAAI,IAAI,CAAC5C,YAAY,EAAE;YACtBV,KAAKqD,KAAK;QACX;QACA,MAAM,IAAI,CAACE,cAAc,CAAC;YAAC,IAAI,CAACzC,IAAI;SAAC;QACrC,MAAM0C,UAAU,MAAM,IAAI,CAACC,kBAAkB,CAACH;QAE9C,IAAI,IAAI,CAAC5C,YAAY,EAAE;YACtBV,KAAK0D,IAAI;YACTzE,gBAAgB;gBACf0E,UAAU3D,KAAKwD,OAAO,CAACG,QAAQ;gBAC/B/C,MAAM,IAAI,CAACA,IAAI;gBACfiB,SAAS,IAAI,CAACd,SAAS;gBACvBE,iBAAiB,IAAI,CAACA,eAAe;gBACrC2C,gBAAgB,IAAI,CAAC5C,aAAa;gBAClCG,kBAAkB,IAAI,CAACA,gBAAgB;gBACvC0C,iBAAiB,IAAI,CAAC3C,cAAc;gBACpCE,MAAM,IAAI,CAACA,IAAI;YAChB;QACD;QACA,OAAOkC,gBAAgBE,UAAUvB;IAClC;IAEA,MAAMsB,eAAeO,KAAe,EAAE;QACrC,KAAK,MAAMC,QAAQD,MAAO;YACzB,IAAIE,QACHC,OACAC,WACAC;YACD,IAAI;gBACHA,OAAO,MAAMzE,WAAWqE;YACzB,EAAE,OAAM;YACP,mDAAmD;YACpD;YAEA,MAAMK,cAAcD,QAAQA,KAAKC,WAAW;YAC5C,MAAMC,SAASF,QAAQA,KAAKE,MAAM;YAElC,gDAAgD;YAChD,IAAI,MAAM,IAAI,CAACC,uBAAuB,CAACP,MAAMK,cAAc;gBAC1D;YACD;YAEA,IAAIA,eAAe,CAAC,IAAI,CAAC3B,aAAa,CAACsB,OAAO;gBAC7C,IAAI,CAAC9C,eAAe;gBAEpB+C,SAASjF,aAAa,IAAI,CAACgC,SAAS,EAAEgD;gBACtC,IAAIC,QAAQ;oBACX,IAAI,CAAChD,aAAa;oBAClB,IAAI,CAACH,SAAS,CAAC0D,IAAI,CAAC;wBACnBhE,SAAS,IAAI,CAACA,OAAO;wBACrBiE,OAAOR;wBACPS,MAAMV;wBACNI;wBACA/C,MAAMvC;oBACP;gBACD;gBAEA,IAAI;oBACHoF,QAAQ,MAAMrE,aAAamE;oBAC3B,MAAM,IAAI,CAACR,cAAc,CACxBU,MACES,MAAM,CAAC,CAACC,UAAY,IAAI,CAACxB,YAAY,CAACwB,UACtCvC,GAAG,CAAC,SAAUwC,IAAI;wBAClB,OAAOnG,KAAKsF,MAAMa;oBACnB;gBAEH,EAAE,OAAM;gBACP,qBAAqB;gBACtB;YACD,OAAO,IAAIP,QAAQ;gBAClB,qCAAqC;gBACrC,IAAI,IAAI,CAACxB,gBAAgB,CAACkB,OAAO;oBAChC;gBACD;gBAEA,IAAI,CAAC5C,gBAAgB;gBACrB+C,YAAY3F,SAASwF;gBACrB,MAAMc,gBAAgB9F,aAAa,IAAI,CAACgC,SAAS,EAAEmD;gBACnD,IAAIW,eAAe;oBAClB,IAAI,CAAC3D,cAAc;oBACnB,IAAI,CAACL,SAAS,CAAC0D,IAAI,CAAC;wBACnBhE,SAAS,IAAI,CAACA,OAAO;wBACrBiE,OAAOK,aAAa,CAAC,EAAE;wBACvBJ,MAAMV;wBACNI;wBACA/C,MAAMtC;oBACP;gBACD;YACD;QACD;IACD;IAEA,MAAMgG,gBAAgBhC,QAAgB,EAAmB;QACxD,IAAI;YACH,MAAMiC,UAAU,MAAMjF,cAAcgD,UAAU;YAC9C,OAAOiC;QACR,EAAE,OAAOxC,OAAO;YACf,wBAAwB,GACxB,OAAO,CAAC,oBAAoB,EAAEA,MAAMyC,OAAO,EAAE;QAC9C;IACD;IAEA,MAAMC,kBAAkB3B,aAAsB,EAAE;QAC/C,MAAM4B,YAAY,IAAI,CAACrE,SAAS,CAAC6D,MAAM,CACtC,CAACX,OAASA,KAAK3C,IAAI,KAAKtC;QAGzB,IAAI0E,UAAU;QACd,IAAI,IAAI,CAAClC,SAAS,KAAK,UAAU;YAChC,KAAK,MAAMyC,QAAQmB,UAAW;gBAC7B,MAAMC,eAAezG,SAAS,IAAI,CAACoC,IAAI,EAAEiD,KAAKU,IAAI;gBAClD,IAAInB,eAAe;oBAClBE,WAAW,CAAC,OAAO,EAAE2B,aAAa,OAAO,CAAC;gBAC3C,OAAO;oBACNlF,OAAOmF,GAAG,CAAC,CAAC,OAAO,EAAED,aAAa,KAAK,CAAC;gBACzC;gBACA,MAAMJ,UAAU,MAAM,IAAI,CAACD,eAAe,CAACf,KAAKU,IAAI;gBACpD,IAAInB,eAAe;oBAClBE,WAAW,GAAGuB,QAAQ,EAAE,CAAC;gBAC1B,OAAO;oBACN9E,OAAOmF,GAAG,CAACL;gBACZ;gBACA,gEAAgE;gBAChE,IAAIhB,SAASmB,SAAS,CAACA,UAAUnC,MAAM,GAAG,EAAE,EAAE;oBAC7C,IAAIO,eAAe;wBAClBE,WAAW;oBACZ,OAAO;wBACNvD,OAAOmF,GAAG,CAAC;oBACZ;gBACD;YACD;QACD,OAAO,IAAI,IAAI,CAAC9D,SAAS,KAAK,OAAO;YACpC,IAAIgC,eAAe;gBAClBE,WAAW;YACZ,OAAO;gBACNvD,OAAOmF,GAAG,CAAC;YACZ;YAEA,IAAK,IAAIC,IAAI,GAAGA,IAAIH,UAAUnC,MAAM,EAAEsC,IAAK;gBAC1C,MAAMtB,OAAOmB,SAAS,CAACG,EAAE;gBACzB,MAAMF,eAAezG,SAAS,IAAI,CAACoC,IAAI,EAAEiD,KAAKU,IAAI;gBAClD,MAAMM,UAAU,MAAM,IAAI,CAACD,eAAe,CAACf,KAAKU,IAAI;gBAEpD,IAAInB,eAAe;oBAClBE,WAAW,CAAC,iBAAiB,EAAE6B,IAAI,EAAE,IAAI,CAAC;oBAC1C7B,WAAW,CAAC,UAAU,EAAE2B,aAAa,WAAW,CAAC;oBACjD3B,WAAW;oBACXA,WAAW,GAAGuB,QAAQ,EAAE,CAAC;oBACzBvB,WAAW;oBACXA,WAAW;gBACZ,OAAO;oBACNvD,OAAOmF,GAAG,CAAC,CAAC,iBAAiB,EAAEC,IAAI,EAAE,EAAE,CAAC;oBACxCpF,OAAOmF,GAAG,CAAC,CAAC,UAAU,EAAED,aAAa,SAAS,CAAC;oBAC/ClF,OAAOmF,GAAG,CAAC;oBACXnF,OAAOmF,GAAG,CAACL;oBACX9E,OAAOmF,GAAG,CAAC;oBACXnF,OAAOmF,GAAG,CAAC;gBACZ;YACD;YAEA,IAAI9B,eAAe;gBAClBE,WAAW;YACZ,OAAO;gBACNvD,OAAOmF,GAAG,CAAC;YACZ;QACD;QACA,OAAO5B;IACR;IAEA,MAAMc,wBACLgB,QAAgB,EAChBlB,WAAoB,EACD;QACnB,sBAAsB,GACtB,IAAI,IAAI,CAAC5C,eAAe,EAAE;YACzB,OAAO;QACR;QACA,OAAO,IAAI,CAACD,gBAAgB,CAACgE,SAAS,CAACD,UAAUlB;IAClD;IAEA,MAAMX,mBAAmBH,aAAsB,EAAE;QAChD,sBAAsB,GACtB,IAAI,CAAC,IAAI,CAACpD,MAAM,EAAE;YACjBD,OAAOmF,GAAG;QACX;QAEA,IAAI,IAAI,CAACxE,IAAI,EAAE;YACd;;;;IAIC,GACD,IAAI,CAACM,cAAc,GAAG;QACvB;QAEA,mEAAmE;QACnE,IAAI,IAAI,CAACI,SAAS,IAAI;YAAC;YAAU;SAAM,CAAC4B,QAAQ,CAAC,IAAI,CAAC5B,SAAS,GAAG;YACjE,OAAO,MAAM,IAAI,CAAC2D,iBAAiB,CAAC3B;QACrC;QAEA,KAAK,MAAMS,QAAQ,IAAI,CAAClD,SAAS,CAAE;YAClC,IACC,AAAC,IAAI,CAACO,IAAI,KAAKtC,iBAAiBiF,KAAK3C,IAAI,KAAKtC,iBAC7C,IAAI,CAACsC,IAAI,KAAKvC,sBACdkF,KAAK3C,IAAI,KAAKvC,sBACf,IAAI,CAACuC,IAAI,KAAKxC,eACb;gBACD,IAAI4G,OAMC;oBACHC,OAAO;oBACPC,OAAO;oBACPC,MAAM;oBACNC,OAAO;oBACPC,MAAM;gBACP,GACApB,MACAqB,YAAoB;gBAErB,sBAAsB,GACtB,IAAI,IAAI,CAACrF,kBAAkB,EAAE;oBAC5B+E,OAAO,MAAMxG,mBAAmB+E,KAAKI,IAAI,EAAEJ,KAAK3C,IAAI;oBACpD0E,YAAY;gBACb;gBAEA,MAAMC,QAAQhC,KAAK3C,IAAI,KAAKtC,gBAAgBU,MAAMwG,IAAI,GAAGxG,MAAMyG,IAAI;gBACnExB,OAAO/F,SAAS,IAAI,CAACoC,IAAI,EAAEiD,KAAKU,IAAI;gBAEpC,IAAIV,KAAKS,KAAK,EAAE;oBACf,MAAM0B,WAAWC,OAAOpC,KAAKS,KAAK,GAAG,2BAA2B;oBAChE,MAAMA,QAAQ,IAAIxC,OAAOkE,UAAU;oBACnC,MAAME,mBAAmB5G,MAAM6G,KAAK,GAAGC,QAAQ,CAACJ;oBAChDzB,OAAOsB,MAAMtB,KAAKxB,OAAO,CAACuB,OAAO4B;gBAClC,OAAO;oBACN3B,OAAOsB,MAAMtB;gBACd;gBAEA,IAAI,IAAI,CAAC7D,IAAI,IAAImD,KAAK3C,IAAI,KAAKtC,eAAe;oBAC7C,MAAM,EAAEyH,kBAAkB,EAAE/C,OAAO,EAAE,GAAG,MAAMrE,cAC7C4E,KAAKU,IAAI,EACT,IAAI,CAAC7D,IAAI;oBAEV,wBAAwB,GACxB,IAAI2F,oBAAoB;wBACvB,IAAI,CAACrF,cAAc;wBACnB,MAAMsF,cAAc/G,KAAK,cAAc8G;wBAEvCtG,OAAOmF,GAAG,CACT,CAAC,GAAG,EAAEU,UAAU,EAAE,EAAEA,UAAU,EAAE,EAAEA,UAAU,EAAE,EAAEA,UAAU,EAAE,CAAC,EAC7DN,KAAKG,IAAI,CAACxD,IAAI,IACdqD,KAAKI,KAAK,CAACzD,IAAI,IACfqD,KAAKK,IAAI,CAAC1D,IAAI,IACdqD,KAAKE,KAAK,EACVjB,MACA,CAAC,CAAC,EAAEjF,MAAMiH,KAAK,CAACF,oBAAoB,CAAC,EAAEC,YAAY,CAAC,CAAC;wBAEtDvG,OAAOmF,GAAG,CAAC,GAAG5B,QAAQ/E,IAAI,CAAC,MAAM,EAAE,CAAC;oBACrC;gBACD,OAAO;oBACN,wBAAwB,GACxB,IAAI,CAAC,IAAI,CAACmC,IAAI,EAAE;wBACfX,OAAOmF,GAAG,CACT,CAAC,GAAG,EAAEU,UAAU,EAAE,EAAEA,UAAU,EAAE,EAAEA,UAAU,EAAE,EAAEA,UAAU,EAAE,CAAC,EAC7DN,KAAKG,IAAI,CAACxD,IAAI,IACdqD,KAAKI,KAAK,CAACzD,IAAI,IACfqD,KAAKK,IAAI,CAAC1D,IAAI,IACdqD,KAAKE,KAAK,EACVjB;wBAED,IAAIV,KAAKxD,OAAO,EAAE;4BACjB,MAAMrB,iBAAiB6E,KAAKU,IAAI,EAAEV,KAAKxD,OAAO;wBAC/C;oBACD;gBACD;YACD;QACD;IACD;AACD"}
1
+ {"version":3,"sources":["../src/core.ts"],"sourcesContent":["import { basename, extname, join, relative } from \"node:path\";\nimport { GitIgnoreHandler } from \"./gitIgnoreHandler.js\";\nimport {\n\tSTR_TYPE_BOTH,\n\tSTR_TYPE_DIRECTORY,\n\tSTR_TYPE_FILE,\n\tcheckPattern,\n\tformatLongListings,\n\tprintStatistics,\n\trunCommandOnNode,\n\trunGrepOnNode,\n} from \"./utilities.js\";\n\nimport { promisify } from \"node:util\";\nimport { Logger } from \"@node-cli/logger\";\nimport { Performance } from \"@node-cli/perf\";\nimport fs from \"fs-extra\";\nimport kleur from \"kleur\";\nimport plur from \"plur\";\n\nconst lstatAsync = promisify(fs.lstat);\nconst readdirAsync = promisify(fs.readdir);\nconst readFileAsync = promisify(fs.readFile);\nconst perf = new Performance();\nconst logger = new Logger({\n\tboring: process.env.NODE_ENV === \"test\",\n});\n\nexport class Search {\n\tboring?: boolean;\n\tcommand?: string;\n\tdisplayHiddenFilesAndFolders?: boolean;\n\tdisplayLongListing?: boolean;\n\tdisplayStats?: boolean;\n\tfoldersBlacklist?: RegExp;\n\tgrep?: RegExp;\n\tnodesList?: any[];\n\tpath?: string;\n\trePattern?: RegExp;\n\ttotalDirFound?: number;\n\ttotalDirScanned?: number;\n\ttotalFileFound?: number;\n\ttotalFileScanned?: number;\n\ttype?: string;\n\tignoreExtensions?: string[];\n\tprintMode?: string;\n\tgitIgnoreHandler: GitIgnoreHandler;\n\tignoreGitIgnore?: boolean;\n\n\tconstructor({\n\t\tboring,\n\t\tcommand,\n\t\tdot,\n\t\tfoldersBlacklist,\n\t\tgrep,\n\t\tignoreCase,\n\t\tshort,\n\t\tpath,\n\t\tpattern,\n\t\tstats,\n\t\ttype,\n\t\tignore,\n\t\tprintMode,\n\t\tignoreGitIgnore,\n\t}: {\n\t\tboring?: boolean;\n\t\tcommand?: string;\n\t\tdot?: boolean;\n\t\tfoldersBlacklist?: RegExp;\n\t\tgrep?: string | RegExp;\n\t\tignoreCase?: boolean;\n\t\tshort?: boolean;\n\t\tpath?: string;\n\t\tpattern?: string;\n\t\tstats?: boolean;\n\t\ttype?: string;\n\t\tignore?: string[];\n\t\tprintMode?: string;\n\t\tignoreGitIgnore?: boolean;\n\t}) {\n\t\tthis.path = path;\n\t\tthis.rePattern = pattern\n\t\t\t? new RegExp(pattern, ignoreCase ? \"i\" : \"\")\n\t\t\t: undefined;\n\t\tthis.type = type || STR_TYPE_BOTH;\n\t\tthis.boring = boring;\n\t\tkleur.enabled = !boring;\n\t\tthis.displayLongListing = !short;\n\t\tthis.displayStats = stats;\n\t\tthis.displayHiddenFilesAndFolders = dot;\n\t\tthis.nodesList = [];\n\t\tthis.foldersBlacklist = foldersBlacklist;\n\t\tthis.totalDirScanned = 0;\n\t\tthis.totalFileScanned = 0;\n\t\tthis.totalDirFound = 0;\n\t\tthis.totalFileFound = 0;\n\t\tthis.command = command ? command.trim() : undefined;\n\t\tthis.ignoreExtensions = ignore.map((ext) => ext.toLowerCase());\n\t\tthis.printMode = printMode;\n\t\tthis.ignoreGitIgnore = ignoreGitIgnore;\n\t\tthis.gitIgnoreHandler = new GitIgnoreHandler();\n\t\ttry {\n\t\t\tthis.grep = grep ? new RegExp(grep, ignoreCase ? \"gi\" : \"g\") : undefined;\n\t\t} catch (error) {\n\t\t\tlogger.error(error);\n\t\t\t// eslint-disable-next-line unicorn/no-process-exit\n\t\t\tprocess.exit(1);\n\t\t}\n\t}\n\n\tignoreFolders(directory: string) {\n\t\tthis.foldersBlacklist.lastIndex = 0;\n\t\treturn this.foldersBlacklist.test(basename(directory));\n\t}\n\n\tshouldIgnoreFile(filePath: string) {\n\t\tif (!this.ignoreExtensions || this.ignoreExtensions.length === 0) {\n\t\t\treturn false;\n\t\t}\n\n\t\tconst extension = extname(filePath).toLowerCase().replace(/^\\./, \"\");\n\t\treturn this.ignoreExtensions.includes(extension);\n\t}\n\n\tfilterHidden(value: string[] | string) {\n\t\tif (this.displayHiddenFilesAndFolders) {\n\t\t\treturn true;\n\t\t}\n\t\treturn value[0] !== \".\";\n\t}\n\n\tisBinaryFileExtension(filePath: string): boolean {\n\t\tconst ext = extname(filePath).toLowerCase().replace(/^\\./, \"\");\n\n\t\t// If there's no extension, assume it's binary\n\t\t/* istanbul ignore if */\n\t\tif (!ext) {\n\t\t\treturn true;\n\t\t}\n\n\t\tconst binaryExtensions = [\n\t\t\t// Executables and compiled code\n\t\t\t\"exe\",\n\t\t\t\"dll\",\n\t\t\t\"so\",\n\t\t\t\"dylib\",\n\t\t\t\"bin\",\n\t\t\t\"obj\",\n\t\t\t\"o\",\n\t\t\t// Compressed files\n\t\t\t\"zip\",\n\t\t\t\"tar\",\n\t\t\t\"gz\",\n\t\t\t\"rar\",\n\t\t\t\"7z\",\n\t\t\t\"jar\",\n\t\t\t\"war\",\n\t\t\t// Media files\n\t\t\t\"jpg\",\n\t\t\t\"jpeg\",\n\t\t\t\"png\",\n\t\t\t\"gif\",\n\t\t\t\"bmp\",\n\t\t\t\"ico\",\n\t\t\t\"tif\",\n\t\t\t\"tiff\",\n\t\t\t\"mp3\",\n\t\t\t\"mp4\",\n\t\t\t\"avi\",\n\t\t\t\"mov\",\n\t\t\t\"wmv\",\n\t\t\t\"flv\",\n\t\t\t\"wav\",\n\t\t\t\"ogg\",\n\t\t\t// Document formats\n\t\t\t\"pdf\",\n\t\t\t\"doc\",\n\t\t\t\"docx\",\n\t\t\t\"xls\",\n\t\t\t\"xlsx\",\n\t\t\t\"ppt\",\n\t\t\t\"pptx\",\n\t\t\t// Database files\n\t\t\t\"db\",\n\t\t\t\"sqlite\",\n\t\t\t\"mdb\",\n\t\t\t// Other binary formats\n\t\t\t\"class\",\n\t\t\t\"pyc\",\n\t\t\t\"pyd\",\n\t\t\t\"pyo\",\n\t\t\t\"woff\",\n\t\t\t\"woff2\",\n\t\t\t\"ttf\",\n\t\t\t\"otf\",\n\t\t];\n\n\t\treturn binaryExtensions.includes(ext);\n\t}\n\n\tasync start(returnResults = false) {\n\t\tif (this.displayStats) {\n\t\t\tperf.start();\n\t\t}\n\t\tawait this.scanFileSystem([this.path]);\n\t\tconst results = await this.postProcessResults(returnResults);\n\n\t\tif (this.displayStats) {\n\t\t\tperf.stop();\n\t\t\tprintStatistics({\n\t\t\t\tduration: perf.results.duration,\n\t\t\t\tgrep: this.grep,\n\t\t\t\tpattern: this.rePattern,\n\t\t\t\ttotalDirScanned: this.totalDirScanned,\n\t\t\t\ttotalDirsFound: this.totalDirFound,\n\t\t\t\ttotalFileScanned: this.totalFileScanned,\n\t\t\t\ttotalFilesFound: this.totalFileFound,\n\t\t\t\ttype: this.type,\n\t\t\t});\n\t\t}\n\t\treturn returnResults ? results : undefined;\n\t}\n\n\tasync scanFileSystem(nodes: string[]) {\n\t\tfor (const node of nodes) {\n\t\t\tlet result: boolean | RegExpExecArray,\n\t\t\t\tfiles: string[],\n\t\t\t\tshortname: string,\n\t\t\t\tstat: fs.Stats;\n\t\t\ttry {\n\t\t\t\tstat = await lstatAsync(node);\n\t\t\t} catch {\n\t\t\t\t// ignore read permission denied errors silently...\n\t\t\t}\n\n\t\t\tconst isDirectory = stat && stat.isDirectory();\n\t\t\tconst isFile = stat && stat.isFile();\n\n\t\t\t// Add this check to respect .gitignore patterns\n\t\t\tif (await this.shouldIgnoreByGitIgnore(node, isDirectory)) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (isDirectory && !this.ignoreFolders(node)) {\n\t\t\t\tthis.totalDirScanned++;\n\n\t\t\t\tresult = checkPattern(this.rePattern, node);\n\t\t\t\tif (result) {\n\t\t\t\t\tthis.totalDirFound++;\n\t\t\t\t\tthis.nodesList.push({\n\t\t\t\t\t\tcommand: this.command,\n\t\t\t\t\t\tmatch: result,\n\t\t\t\t\t\tname: node,\n\t\t\t\t\t\tstat,\n\t\t\t\t\t\ttype: STR_TYPE_DIRECTORY,\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\ttry {\n\t\t\t\t\tfiles = await readdirAsync(node);\n\t\t\t\t\tawait this.scanFileSystem(\n\t\t\t\t\t\tfiles\n\t\t\t\t\t\t\t.filter((element) => this.filterHidden(element))\n\t\t\t\t\t\t\t.map(function (file) {\n\t\t\t\t\t\t\t\treturn join(node, file);\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t);\n\t\t\t\t} catch {\n\t\t\t\t\t// nothing to declare\n\t\t\t\t}\n\t\t\t} else if (isFile) {\n\t\t\t\t// Skip files with ignored extensions\n\t\t\t\tif (this.shouldIgnoreFile(node)) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tthis.totalFileScanned++;\n\t\t\t\tshortname = basename(node);\n\t\t\t\tconst patternResult = checkPattern(this.rePattern, shortname);\n\t\t\t\tif (patternResult) {\n\t\t\t\t\tthis.totalFileFound++;\n\t\t\t\t\tthis.nodesList.push({\n\t\t\t\t\t\tcommand: this.command,\n\t\t\t\t\t\tmatch: patternResult[0],\n\t\t\t\t\t\tname: node,\n\t\t\t\t\t\tstat,\n\t\t\t\t\t\ttype: STR_TYPE_FILE,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tasync readFileContent(filePath: string): Promise<string> {\n\t\ttry {\n\t\t\t// Check if it's a known binary extension\n\t\t\t/* istanbul ignore if */\n\t\t\tif (this.isBinaryFileExtension(filePath)) {\n\t\t\t\treturn \"[Binary file]\";\n\t\t\t}\n\t\t\tconst content = await readFileAsync(filePath, \"utf8\");\n\t\t\treturn content;\n\t\t} catch (error) {\n\t\t\t/* istanbul ignore next */\n\t\t\treturn `Error reading file: ${error.message}`;\n\t\t}\n\t}\n\n\tasync printFilesContent(returnResults: boolean) {\n\t\tconst fileNodes = this.nodesList.filter(\n\t\t\t(node) => node.type === STR_TYPE_FILE,\n\t\t);\n\n\t\tlet results = \"\";\n\t\tif (this.printMode === \"simple\") {\n\t\t\tfor (const node of fileNodes) {\n\t\t\t\tconst relativePath = relative(this.path, node.name);\n\t\t\t\tif (returnResults) {\n\t\t\t\t\tresults += `---\\n./${relativePath}\\n---\\n`;\n\t\t\t\t} else {\n\t\t\t\t\tlogger.log(`---\\n./${relativePath}\\n---`);\n\t\t\t\t}\n\t\t\t\tconst content = await this.readFileContent(node.name);\n\t\t\t\tif (returnResults) {\n\t\t\t\t\tresults += `${content}\\n`;\n\t\t\t\t} else {\n\t\t\t\t\tlogger.log(content);\n\t\t\t\t}\n\t\t\t\t// adding a new line after each file content except the last one\n\t\t\t\tif (node !== fileNodes[fileNodes.length - 1]) {\n\t\t\t\t\tif (returnResults) {\n\t\t\t\t\t\tresults += \"\\n\";\n\t\t\t\t\t} else {\n\t\t\t\t\t\tlogger.log(\"\");\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t} else if (this.printMode === \"xml\") {\n\t\t\tif (returnResults) {\n\t\t\t\tresults += \"<documents>\\n\";\n\t\t\t} else {\n\t\t\t\tlogger.log(\"<documents>\");\n\t\t\t}\n\n\t\t\tfor (let i = 0; i < fileNodes.length; i++) {\n\t\t\t\tconst node = fileNodes[i];\n\t\t\t\tconst relativePath = relative(this.path, node.name);\n\t\t\t\tconst content = await this.readFileContent(node.name);\n\n\t\t\t\tif (returnResults) {\n\t\t\t\t\tresults += `<document index=\"${i + 1}\">\\n`;\n\t\t\t\t\tresults += `<source>./${relativePath}</source>\\n`;\n\t\t\t\t\tresults += \"<document_content>\\n\";\n\t\t\t\t\tresults += `${content}\\n`;\n\t\t\t\t\tresults += \"</document_content>\\n\";\n\t\t\t\t\tresults += \"</document>\\n\";\n\t\t\t\t} else {\n\t\t\t\t\tlogger.log(`<document index=\"${i + 1}\">`);\n\t\t\t\t\tlogger.log(`<source>./${relativePath}</source>`);\n\t\t\t\t\tlogger.log(\"<document_content>\");\n\t\t\t\t\tlogger.log(content);\n\t\t\t\t\tlogger.log(\"</document_content>\");\n\t\t\t\t\tlogger.log(\"</document>\");\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (returnResults) {\n\t\t\t\tresults += \"</documents>\";\n\t\t\t} else {\n\t\t\t\tlogger.log(\"</documents>\");\n\t\t\t}\n\t\t}\n\t\treturn results;\n\t}\n\n\tasync shouldIgnoreByGitIgnore(\n\t\tnodePath: string,\n\t\tisDirectory: boolean,\n\t): Promise<boolean> {\n\t\t/* istanbul ignore if */\n\t\tif (this.ignoreGitIgnore) {\n\t\t\treturn false;\n\t\t}\n\t\treturn this.gitIgnoreHandler.isIgnored(nodePath, isDirectory);\n\t}\n\n\tasync postProcessResults(returnResults: boolean) {\n\t\t/* istanbul ignore if */\n\t\tif (!this.boring) {\n\t\t\tlogger.log();\n\t\t}\n\n\t\tif (this.grep) {\n\t\t\t/**\n\t\t\t * Resetting the number of files found, since we want to\n\t\t\t * show how many matched the grep, not how many matched the\n\t\t\t * pattern (in the file name).\n\t\t\t */\n\t\t\tthis.totalFileFound = 0;\n\t\t}\n\n\t\t// If printMode is enabled, handle file content printing and return\n\t\tif (this.printMode && [\"simple\", \"xml\"].includes(this.printMode)) {\n\t\t\treturn await this.printFilesContent(returnResults);\n\t\t}\n\n\t\tfor (const node of this.nodesList) {\n\t\t\tif (\n\t\t\t\t(this.type === STR_TYPE_FILE && node.type === STR_TYPE_FILE) ||\n\t\t\t\t(this.type === STR_TYPE_DIRECTORY &&\n\t\t\t\t\tnode.type === STR_TYPE_DIRECTORY) ||\n\t\t\t\tthis.type === STR_TYPE_BOTH\n\t\t\t) {\n\t\t\t\tlet list: {\n\t\t\t\t\t\tgroup?: string;\n\t\t\t\t\t\tmdate?: string;\n\t\t\t\t\t\tmode?: string;\n\t\t\t\t\t\towner?: string;\n\t\t\t\t\t\tsize?: string;\n\t\t\t\t\t} = {\n\t\t\t\t\t\tgroup: \"\",\n\t\t\t\t\t\tmdate: \"\",\n\t\t\t\t\t\tmode: \"\",\n\t\t\t\t\t\towner: \"\",\n\t\t\t\t\t\tsize: \"\",\n\t\t\t\t\t},\n\t\t\t\t\tname: string,\n\t\t\t\t\tseparator: string = \"\";\n\n\t\t\t\t/* istanbul ignore if */\n\t\t\t\tif (this.displayLongListing) {\n\t\t\t\t\tlist = await formatLongListings(node.stat, node.type);\n\t\t\t\t\tseparator = \"\\t\";\n\t\t\t\t}\n\n\t\t\t\tconst color = node.type === STR_TYPE_FILE ? kleur.gray : kleur.blue;\n\t\t\t\tname = relative(this.path, node.name);\n\n\t\t\t\tif (node.match) {\n\t\t\t\t\tconst matchStr = String(node.match); // Ensure match is a string\n\t\t\t\t\tconst match = new RegExp(matchStr, \"g\");\n\t\t\t\t\tconst highlightedMatch = kleur.black().bgYellow(matchStr);\n\t\t\t\t\tname = color(name.replace(match, highlightedMatch));\n\t\t\t\t} else {\n\t\t\t\t\tname = color(name);\n\t\t\t\t}\n\n\t\t\t\tif (this.grep && node.type === STR_TYPE_FILE) {\n\t\t\t\t\tconst { totalMatchingLines, results } = await runGrepOnNode(\n\t\t\t\t\t\tnode.name,\n\t\t\t\t\t\tthis.grep,\n\t\t\t\t\t);\n\t\t\t\t\t/* istanbul ignore else */\n\t\t\t\t\tif (totalMatchingLines) {\n\t\t\t\t\t\tthis.totalFileFound++;\n\t\t\t\t\t\tconst occurrences = plur(\"occurrence\", totalMatchingLines);\n\n\t\t\t\t\t\tlogger.log(\n\t\t\t\t\t\t\t` %s${separator}%s${separator}%s${separator}%s${separator}%s`,\n\t\t\t\t\t\t\tlist.mode.trim(),\n\t\t\t\t\t\t\tlist.owner.trim(),\n\t\t\t\t\t\t\tlist.size.trim(),\n\t\t\t\t\t\t\tlist.mdate,\n\t\t\t\t\t\t\tname,\n\t\t\t\t\t\t\t`(${kleur.white(totalMatchingLines)} ${occurrences})`,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tlogger.log(`${results.join(\"\\n\")}\\n`);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t/* istanbul ignore next */\n\t\t\t\t\tif (!this.grep) {\n\t\t\t\t\t\tlogger.log(\n\t\t\t\t\t\t\t` %s${separator}%s${separator}%s${separator}%s${separator}%s`,\n\t\t\t\t\t\t\tlist.mode.trim(),\n\t\t\t\t\t\t\tlist.owner.trim(),\n\t\t\t\t\t\t\tlist.size.trim(),\n\t\t\t\t\t\t\tlist.mdate,\n\t\t\t\t\t\t\tname,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tif (node.command) {\n\t\t\t\t\t\t\tawait runCommandOnNode(node.name, node.command);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n"],"names":["basename","extname","join","relative","GitIgnoreHandler","STR_TYPE_BOTH","STR_TYPE_DIRECTORY","STR_TYPE_FILE","checkPattern","formatLongListings","printStatistics","runCommandOnNode","runGrepOnNode","promisify","Logger","Performance","fs","kleur","plur","lstatAsync","lstat","readdirAsync","readdir","readFileAsync","readFile","perf","logger","boring","process","env","NODE_ENV","Search","command","displayHiddenFilesAndFolders","displayLongListing","displayStats","foldersBlacklist","grep","nodesList","path","rePattern","totalDirFound","totalDirScanned","totalFileFound","totalFileScanned","type","ignoreExtensions","printMode","gitIgnoreHandler","ignoreGitIgnore","constructor","dot","ignoreCase","short","pattern","stats","ignore","RegExp","undefined","enabled","trim","map","ext","toLowerCase","error","exit","ignoreFolders","directory","lastIndex","test","shouldIgnoreFile","filePath","length","extension","replace","includes","filterHidden","value","isBinaryFileExtension","binaryExtensions","start","returnResults","scanFileSystem","results","postProcessResults","stop","duration","totalDirsFound","totalFilesFound","nodes","node","result","files","shortname","stat","isDirectory","isFile","shouldIgnoreByGitIgnore","push","match","name","filter","element","file","patternResult","readFileContent","content","message","printFilesContent","fileNodes","relativePath","log","i","nodePath","isIgnored","list","group","mdate","mode","owner","size","separator","color","gray","blue","matchStr","String","highlightedMatch","black","bgYellow","totalMatchingLines","occurrences","white"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@node-cli/search",
3
- "version": "1.2.1",
3
+ "version": "1.2.2",
4
4
  "license": "MIT",
5
5
  "author": "Arno Versini",
6
6
  "description": "Search for files in a directory",
@@ -38,5 +38,5 @@
38
38
  "publishConfig": {
39
39
  "access": "public"
40
40
  },
41
- "gitHead": "ceed68bb02e65adc4733de1e9c108179e8fd73c7"
41
+ "gitHead": "36c0a7824ac2405ab34f4c4d59e94ad9c1684bc7"
42
42
  }