@node-cli/search 1.2.0 → 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) {
@@ -171,7 +239,7 @@ export class Search {
171
239
  let results = "";
172
240
  if (this.printMode === "simple") {
173
241
  for (const node of fileNodes){
174
- const relativePath = relative(process.cwd(), node.name);
242
+ const relativePath = relative(this.path, node.name);
175
243
  if (returnResults) {
176
244
  results += `---\n./${relativePath}\n---\n`;
177
245
  } else {
@@ -200,7 +268,7 @@ export class Search {
200
268
  }
201
269
  for(let i = 0; i < fileNodes.length; i++){
202
270
  const node = fileNodes[i];
203
- const relativePath = relative(process.cwd(), node.name);
271
+ const relativePath = relative(this.path, node.name);
204
272
  const content = await this.readFileContent(node.name);
205
273
  if (returnResults) {
206
274
  results += `<document index="${i + 1}">\n`;
@@ -264,7 +332,7 @@ export class Search {
264
332
  separator = "\t";
265
333
  }
266
334
  const color = node.type === STR_TYPE_FILE ? kleur.gray : kleur.blue;
267
- name = relative(process.cwd(), node.name);
335
+ name = relative(this.path, node.name);
268
336
  if (node.match) {
269
337
  const matchStr = String(node.match); // Ensure match is a string
270
338
  const match = new RegExp(matchStr, "g");
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(process.cwd(), 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(process.cwd(), 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(process.cwd(), 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","cwd","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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"}
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.0",
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": "f49d48b3295462bc2903a532c6901ddfe79a6b16"
41
+ "gitHead": "36c0a7824ac2405ab34f4c4d59e94ad9c1684bc7"
42
42
  }