@node-cli/search 2.0.0 → 3.0.0

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
@@ -5,7 +5,6 @@ export declare class Search {
5
5
  displayHiddenFilesAndFolders?: boolean;
6
6
  displayLongListing?: boolean;
7
7
  displayStats?: boolean;
8
- foldersBlacklist?: RegExp;
9
8
  grep?: RegExp;
10
9
  nodesList?: any[];
11
10
  path?: string;
@@ -17,14 +16,14 @@ export declare class Search {
17
16
  type?: string;
18
17
  ignoreExtensions?: string[];
19
18
  ignoreFiles?: string[];
19
+ ignoreFolders?: string[];
20
20
  printMode?: string;
21
21
  gitIgnoreHandler: GitIgnoreHandler;
22
22
  ignoreGitIgnore?: boolean;
23
- constructor({ boring, command, dot, foldersBlacklist, grep, ignoreCase, short, path, pattern, stats, type, ignoreExtension, ignoreFile, printMode, ignoreGitIgnore, }: {
23
+ constructor({ boring, command, dot, grep, ignoreCase, short, path, pattern, stats, type, ignoreExtension, ignoreFile, ignoreFolder, printMode, ignoreGitIgnore, }: {
24
24
  boring?: boolean;
25
25
  command?: string;
26
26
  dot?: boolean;
27
- foldersBlacklist?: RegExp;
28
27
  grep?: string | RegExp;
29
28
  ignoreCase?: boolean;
30
29
  short?: boolean;
@@ -34,10 +33,11 @@ export declare class Search {
34
33
  type?: string;
35
34
  ignoreExtension?: string[];
36
35
  ignoreFile?: string[];
36
+ ignoreFolder?: string[];
37
37
  printMode?: string;
38
38
  ignoreGitIgnore?: boolean;
39
39
  });
40
- ignoreFolders(directory: string): boolean;
40
+ shouldIgnoreFolder(directory: string): boolean;
41
41
  shouldIgnoreFile(filePath: string): boolean;
42
42
  filterHidden(value: string[] | string): boolean;
43
43
  isBinaryFileExtension(filePath: string): boolean;
package/dist/core.js CHANGED
@@ -20,7 +20,6 @@ export class Search {
20
20
  displayHiddenFilesAndFolders;
21
21
  displayLongListing;
22
22
  displayStats;
23
- foldersBlacklist;
24
23
  grep;
25
24
  nodesList;
26
25
  path;
@@ -32,10 +31,11 @@ export class Search {
32
31
  type;
33
32
  ignoreExtensions;
34
33
  ignoreFiles;
34
+ ignoreFolders;
35
35
  printMode;
36
36
  gitIgnoreHandler;
37
37
  ignoreGitIgnore;
38
- constructor({ boring, command, dot, foldersBlacklist, grep, ignoreCase, short, path, pattern, stats, type, ignoreExtension, ignoreFile, printMode, ignoreGitIgnore }){
38
+ constructor({ boring, command, dot, grep, ignoreCase, short, path, pattern, stats, type, ignoreExtension, ignoreFile, ignoreFolder, printMode, ignoreGitIgnore }){
39
39
  this.path = path;
40
40
  this.rePattern = pattern ? new RegExp(pattern, ignoreCase ? "i" : "") : undefined;
41
41
  this.type = type || STR_TYPE_BOTH;
@@ -45,14 +45,14 @@ export class Search {
45
45
  this.displayStats = stats;
46
46
  this.displayHiddenFilesAndFolders = dot;
47
47
  this.nodesList = [];
48
- this.foldersBlacklist = foldersBlacklist;
49
48
  this.totalDirScanned = 0;
50
49
  this.totalFileScanned = 0;
51
50
  this.totalDirFound = 0;
52
51
  this.totalFileFound = 0;
53
52
  this.command = command ? command.trim() : undefined;
54
- this.ignoreExtensions = ignoreExtension.map((ext)=>ext.toLowerCase());
53
+ this.ignoreExtensions = ignoreExtension && ignoreExtension.map((ext)=>ext.toLowerCase()) || [];
55
54
  this.ignoreFiles = ignoreFile || [];
55
+ this.ignoreFolders = ignoreFolder || [];
56
56
  this.printMode = printMode;
57
57
  this.ignoreGitIgnore = ignoreGitIgnore;
58
58
  this.gitIgnoreHandler = new GitIgnoreHandler();
@@ -60,13 +60,16 @@ export class Search {
60
60
  this.grep = grep ? new RegExp(grep, ignoreCase ? "gi" : "g") : undefined;
61
61
  } catch (error) {
62
62
  logger.error(error);
63
- // eslint-disable-next-line unicorn/no-process-exit
64
63
  process.exit(1);
65
64
  }
66
65
  }
67
- ignoreFolders(directory) {
68
- this.foldersBlacklist.lastIndex = 0;
69
- return this.foldersBlacklist.test(basename(directory));
66
+ shouldIgnoreFolder(directory) {
67
+ const folderName = basename(directory);
68
+ // Check for exact folder name match
69
+ if (this.ignoreFolders && this.ignoreFolders.includes(folderName)) {
70
+ return true;
71
+ }
72
+ return false;
70
73
  }
71
74
  shouldIgnoreFile(filePath) {
72
75
  // First check if the file is in the ignoreFiles list
@@ -79,7 +82,22 @@ export class Search {
79
82
  return false;
80
83
  }
81
84
  const extension = extname(filePath).toLowerCase().replace(/^\./, "");
82
- return this.ignoreExtensions.includes(extension);
85
+ // Check for exact extension match
86
+ if (this.ignoreExtensions.includes(extension)) {
87
+ return true;
88
+ }
89
+ // Check for complex patterns like "min.js"
90
+ for (const pattern of this.ignoreExtensions){
91
+ // Skip patterns that don't contain a dot
92
+ if (!pattern.includes(".")) {
93
+ continue;
94
+ }
95
+ // Check if the filename ends with the pattern
96
+ if (filename.toLowerCase().endsWith(`.${pattern}`)) {
97
+ return true;
98
+ }
99
+ }
100
+ return false;
83
101
  }
84
102
  filterHidden(value) {
85
103
  if (this.displayHiddenFilesAndFolders) {
@@ -188,7 +206,7 @@ export class Search {
188
206
  if (await this.shouldIgnoreByGitIgnore(node, isDirectory)) {
189
207
  continue;
190
208
  }
191
- if (isDirectory && !this.ignoreFolders(node)) {
209
+ if (isDirectory && !this.shouldIgnoreFolder(node)) {
192
210
  this.totalDirScanned++;
193
211
  result = checkPattern(this.rePattern, node);
194
212
  if (result) {
package/dist/core.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/core.ts"],"sourcesContent":["import { basename, extname, join, relative } from \"node:path\";\n\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\tignoreFiles?: 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\tignoreExtension,\n\t\tignoreFile,\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\tignoreExtension?: string[];\n\t\tignoreFile?: 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 = ignoreExtension.map((ext) => ext.toLowerCase());\n\t\tthis.ignoreFiles = ignoreFile || [];\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\t// First check if the file is in the ignoreFiles list\n\t\tconst filename = basename(filePath);\n\t\tif (this.ignoreFiles && this.ignoreFiles.includes(filename)) {\n\t\t\treturn true;\n\t\t}\n\n\t\t// Then check if the extension should be ignored\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","ignoreFiles","printMode","gitIgnoreHandler","ignoreGitIgnore","constructor","dot","ignoreCase","short","pattern","stats","ignoreExtension","ignoreFile","RegExp","undefined","enabled","trim","map","ext","toLowerCase","error","exit","ignoreFolders","directory","lastIndex","test","shouldIgnoreFile","filePath","filename","includes","length","extension","replace","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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"}
1
+ {"version":3,"sources":["../src/core.ts"],"sourcesContent":["import { basename, extname, join, relative } from \"node:path\";\n\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\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\tignoreFiles?: string[];\n\tignoreFolders?: string[];\n\tprintMode?: string;\n\tgitIgnoreHandler: GitIgnoreHandler;\n\tignoreGitIgnore?: boolean;\n\n\tconstructor({\n\t\tboring,\n\t\tcommand,\n\t\tdot,\n\t\tgrep,\n\t\tignoreCase,\n\t\tshort,\n\t\tpath,\n\t\tpattern,\n\t\tstats,\n\t\ttype,\n\t\tignoreExtension,\n\t\tignoreFile,\n\t\tignoreFolder,\n\t\tprintMode,\n\t\tignoreGitIgnore,\n\t}: {\n\t\tboring?: boolean;\n\t\tcommand?: string;\n\t\tdot?: boolean;\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\tignoreExtension?: string[];\n\t\tignoreFile?: string[];\n\t\tignoreFolder?: 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.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 =\n\t\t\t(ignoreExtension && ignoreExtension.map((ext) => ext.toLowerCase())) ||\n\t\t\t[];\n\t\tthis.ignoreFiles = ignoreFile || [];\n\t\tthis.ignoreFolders = ignoreFolder || [];\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\tprocess.exit(1);\n\t\t}\n\t}\n\n\tshouldIgnoreFolder(directory: string) {\n\t\tconst folderName = basename(directory);\n\t\t// Check for exact folder name match\n\t\tif (this.ignoreFolders && this.ignoreFolders.includes(folderName)) {\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t}\n\n\tshouldIgnoreFile(filePath: string) {\n\t\t// First check if the file is in the ignoreFiles list\n\t\tconst filename = basename(filePath);\n\t\tif (this.ignoreFiles && this.ignoreFiles.includes(filename)) {\n\t\t\treturn true;\n\t\t}\n\n\t\t// Then check if the extension should be ignored\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\n\t\t// Check for exact extension match\n\t\tif (this.ignoreExtensions.includes(extension)) {\n\t\t\treturn true;\n\t\t}\n\n\t\t// Check for complex patterns like \"min.js\"\n\t\tfor (const pattern of this.ignoreExtensions) {\n\t\t\t// Skip patterns that don't contain a dot\n\t\t\tif (!pattern.includes(\".\")) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Check if the filename ends with the pattern\n\t\t\tif (filename.toLowerCase().endsWith(`.${pattern}`)) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\treturn false;\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.shouldIgnoreFolder(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","grep","nodesList","path","rePattern","totalDirFound","totalDirScanned","totalFileFound","totalFileScanned","type","ignoreExtensions","ignoreFiles","ignoreFolders","printMode","gitIgnoreHandler","ignoreGitIgnore","constructor","dot","ignoreCase","short","pattern","stats","ignoreExtension","ignoreFile","ignoreFolder","RegExp","undefined","enabled","trim","map","ext","toLowerCase","error","exit","shouldIgnoreFolder","directory","folderName","includes","shouldIgnoreFile","filePath","filename","length","extension","replace","endsWith","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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"}
@@ -4,7 +4,6 @@ export declare const defaultFlags: {
4
4
  ignoreCase: boolean;
5
5
  short: boolean;
6
6
  stats: boolean;
7
- ignoreExtension: any[];
8
7
  ignoreGitIgnore: boolean;
9
8
  };
10
9
  export declare const defaultParameters: {
package/dist/defaults.js CHANGED
@@ -4,7 +4,6 @@ export const defaultFlags = {
4
4
  ignoreCase: false,
5
5
  short: false,
6
6
  stats: false,
7
- ignoreExtension: [],
8
7
  ignoreGitIgnore: false
9
8
  };
10
9
  export const defaultParameters = {
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/defaults.ts"],"sourcesContent":["export const defaultFlags = {\n\tboring: false,\n\tdot: false,\n\tignoreCase: false,\n\tshort: false,\n\tstats: false,\n\tignoreExtension: [],\n\tignoreGitIgnore: false,\n};\n\nexport const defaultParameters = {\n\t\"0\": process.cwd(),\n};\n"],"names":["defaultFlags","boring","dot","ignoreCase","short","stats","ignoreExtension","ignoreGitIgnore","defaultParameters","process","cwd"],"mappings":"AAAA,OAAO,MAAMA,eAAe;IAC3BC,QAAQ;IACRC,KAAK;IACLC,YAAY;IACZC,OAAO;IACPC,OAAO;IACPC,iBAAiB,EAAE;IACnBC,iBAAiB;AAClB,EAAE;AAEF,OAAO,MAAMC,oBAAoB;IAChC,KAAKC,QAAQC,GAAG;AACjB,EAAE"}
1
+ {"version":3,"sources":["../src/defaults.ts"],"sourcesContent":["export const defaultFlags = {\n\tboring: false,\n\tdot: false,\n\tignoreCase: false,\n\tshort: false,\n\tstats: false,\n\tignoreGitIgnore: false,\n};\n\nexport const defaultParameters = {\n\t\"0\": process.cwd(),\n};\n"],"names":["defaultFlags","boring","dot","ignoreCase","short","stats","ignoreGitIgnore","defaultParameters","process","cwd"],"mappings":"AAAA,OAAO,MAAMA,eAAe;IAC3BC,QAAQ;IACRC,KAAK;IACLC,YAAY;IACZC,OAAO;IACPC,OAAO;IACPC,iBAAiB;AAClB,EAAE;AAEF,OAAO,MAAMC,oBAAoB;IAChC,KAAKC,QAAQC,GAAG;AACjB,EAAE"}
package/dist/parse.js CHANGED
@@ -78,13 +78,19 @@ import { parser } from "@node-cli/parser";
78
78
  },
79
79
  ignoreExtension: {
80
80
  shortFlag: "I",
81
- description: "Ignore files extensions",
81
+ description: "Ignore files extension, can be used multiple times",
82
82
  type: "string",
83
83
  isMultiple: true
84
84
  },
85
85
  ignoreFile: {
86
86
  shortFlag: "F",
87
- description: "Ignore files names",
87
+ description: "Ignore files name, can be used multiple times",
88
+ type: "string",
89
+ isMultiple: true
90
+ },
91
+ ignoreFolder: {
92
+ shortFlag: "D",
93
+ description: "Ignore folders name, can be used multiple times",
88
94
  type: "string",
89
95
  isMultiple: true
90
96
  },
package/dist/parse.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/parse.ts"],"sourcesContent":["import { defaultFlags, defaultParameters } from \"./defaults.js\";\n\nimport { parser } from \"@node-cli/parser\";\n\nexport type Flags = {\n\tboring?: boolean;\n\tdot?: boolean;\n\tignoreCase?: boolean;\n\tshort?: boolean;\n\tstats?: boolean;\n\tgrep?: string;\n\ttype?: string;\n\tignore?: string[];\n\tprintMode?: string;\n};\n\nexport type Parameters = {\n\tpath?: string;\n};\n\nexport type Configuration = {\n\tflags?: Flags;\n\tparameters?: Parameters;\n};\n\n/* istanbul ignore next */\nexport const config: Configuration = parser({\n\tmeta: import.meta,\n\texamples: [\n\t\t{\n\t\t\tcommand: 'search --type f --pattern \".jsx$\" src/',\n\t\t\tcomment:\n\t\t\t\t'## Find all files with the extension \".jsx\" in the \"src\" folder',\n\t\t},\n\t\t{\n\t\t\tcommand: 'search --type f --pattern \".sh$\" --command \"chmod +x\" bin/',\n\t\t\tcomment: `## Change the permissions to executable for all the files with\\n ## the extension \".sh\" found under the \"bin\" folder`,\n\t\t},\n\t\t{\n\t\t\tcommand: 'search --type f --pattern \".md$\" --grep \"Table of Content\"',\n\t\t\tcomment: `## Search in all the markdown files under the \"src\" folder for\\n ## the keywords \"Table of Content\"`,\n\t\t},\n\t],\n\tflags: {\n\t\tboring: {\n\t\t\tshortFlag: \"b\",\n\t\t\tdefault: defaultFlags.boring,\n\t\t\tdescription: \"Do not use color output\",\n\t\t\ttype: \"boolean\",\n\t\t},\n\t\tcommand: {\n\t\t\tshortFlag: \"c\",\n\t\t\tdescription: \"Command to execute over each node (ex: chmod +x)\",\n\t\t\ttype: \"string\",\n\t\t},\n\t\tdot: {\n\t\t\tdefault: defaultFlags.dot,\n\t\t\tdescription: \"Show hidden files and directories\",\n\t\t\ttype: \"boolean\",\n\t\t},\n\t\tgrep: {\n\t\t\tshortFlag: \"g\",\n\t\t\tdescription: \"A RegExp to match the content of the files found\",\n\t\t\ttype: \"string\",\n\t\t},\n\t\thelp: {\n\t\t\tshortFlag: \"h\",\n\t\t\tdescription: \"Display help instructions\",\n\t\t\ttype: \"boolean\",\n\t\t},\n\t\tignoreCase: {\n\t\t\tshortFlag: \"i\",\n\t\t\tdefault: defaultFlags.ignoreCase,\n\t\t\tdescription: \"Ignore case when searching\",\n\t\t\ttype: \"boolean\",\n\t\t},\n\t\tpattern: {\n\t\t\tshortFlag: \"p\",\n\t\t\tdescription: \"A regular expression to match file or folder names\",\n\t\t\ttype: \"string\",\n\t\t},\n\t\tshort: {\n\t\t\tdefault: defaultFlags.short,\n\t\t\tdescription: \"Short listing format (equivalent to ls)\",\n\t\t\ttype: \"boolean\",\n\t\t},\n\t\tstats: {\n\t\t\tshortFlag: \"s\",\n\t\t\tdefault: defaultFlags.stats,\n\t\t\tdescription: \"Display some statistics\",\n\t\t\ttype: \"boolean\",\n\t\t},\n\t\ttype: {\n\t\t\tshortFlag: \"t\",\n\t\t\tdefault: \"both\",\n\t\t\tdescription: \"Search for files (f) or directories (d)\",\n\t\t\ttype: \"string\",\n\t\t},\n\t\tversion: {\n\t\t\tshortFlag: \"v\",\n\t\t\tdescription: \"Output the current version\",\n\t\t\ttype: \"boolean\",\n\t\t},\n\t\tignoreExtension: {\n\t\t\tshortFlag: \"I\",\n\t\t\tdescription: \"Ignore files extensions\",\n\t\t\ttype: \"string\",\n\t\t\tisMultiple: true,\n\t\t},\n\t\tignoreFile: {\n\t\t\tshortFlag: \"F\",\n\t\t\tdescription: \"Ignore files names\",\n\t\t\ttype: \"string\",\n\t\t\tisMultiple: true,\n\t\t},\n\t\tprintMode: {\n\t\t\tshortFlag: \"P\",\n\t\t\tdescription: \"Print mode (simple or xml)\",\n\t\t\ttype: \"string\",\n\t\t},\n\t\tignoreGitIgnore: {\n\t\t\tdescription: \"Ignore .gitignore files\",\n\t\t\tdefault: defaultFlags.ignoreGitIgnore,\n\t\t\ttype: \"boolean\",\n\t\t},\n\t},\n\tparameters: {\n\t\tpath: {\n\t\t\tdefault: \"current folder\",\n\t\t\tdescription: \"the path where to start the search\",\n\t\t},\n\t},\n\tusage: \"search [options] [path]\",\n\tdefaultFlags,\n\tdefaultParameters,\n});\n"],"names":["defaultFlags","defaultParameters","parser","config","meta","examples","command","comment","flags","boring","shortFlag","default","description","type","dot","grep","help","ignoreCase","pattern","short","stats","version","ignoreExtension","isMultiple","ignoreFile","printMode","ignoreGitIgnore","parameters","path","usage"],"mappings":"AAAA,SAASA,YAAY,EAAEC,iBAAiB,QAAQ,gBAAgB;AAEhE,SAASC,MAAM,QAAQ,mBAAmB;AAuB1C,wBAAwB,GACxB,OAAO,MAAMC,SAAwBD,OAAO;IAC3CE,MAAM;IACNC,UAAU;QACT;YACCC,SAAS;YACTC,SACC;QACF;QACA;YACCD,SAAS;YACTC,SAAS,CAAC,uHAAuH,CAAC;QACnI;QACA;YACCD,SAAS;YACTC,SAAS,CAAC,sGAAsG,CAAC;QAClH;KACA;IACDC,OAAO;QACNC,QAAQ;YACPC,WAAW;YACXC,SAASX,aAAaS,MAAM;YAC5BG,aAAa;YACbC,MAAM;QACP;QACAP,SAAS;YACRI,WAAW;YACXE,aAAa;YACbC,MAAM;QACP;QACAC,KAAK;YACJH,SAASX,aAAac,GAAG;YACzBF,aAAa;YACbC,MAAM;QACP;QACAE,MAAM;YACLL,WAAW;YACXE,aAAa;YACbC,MAAM;QACP;QACAG,MAAM;YACLN,WAAW;YACXE,aAAa;YACbC,MAAM;QACP;QACAI,YAAY;YACXP,WAAW;YACXC,SAASX,aAAaiB,UAAU;YAChCL,aAAa;YACbC,MAAM;QACP;QACAK,SAAS;YACRR,WAAW;YACXE,aAAa;YACbC,MAAM;QACP;QACAM,OAAO;YACNR,SAASX,aAAamB,KAAK;YAC3BP,aAAa;YACbC,MAAM;QACP;QACAO,OAAO;YACNV,WAAW;YACXC,SAASX,aAAaoB,KAAK;YAC3BR,aAAa;YACbC,MAAM;QACP;QACAA,MAAM;YACLH,WAAW;YACXC,SAAS;YACTC,aAAa;YACbC,MAAM;QACP;QACAQ,SAAS;YACRX,WAAW;YACXE,aAAa;YACbC,MAAM;QACP;QACAS,iBAAiB;YAChBZ,WAAW;YACXE,aAAa;YACbC,MAAM;YACNU,YAAY;QACb;QACAC,YAAY;YACXd,WAAW;YACXE,aAAa;YACbC,MAAM;YACNU,YAAY;QACb;QACAE,WAAW;YACVf,WAAW;YACXE,aAAa;YACbC,MAAM;QACP;QACAa,iBAAiB;YAChBd,aAAa;YACbD,SAASX,aAAa0B,eAAe;YACrCb,MAAM;QACP;IACD;IACAc,YAAY;QACXC,MAAM;YACLjB,SAAS;YACTC,aAAa;QACd;IACD;IACAiB,OAAO;IACP7B;IACAC;AACD,GAAG"}
1
+ {"version":3,"sources":["../src/parse.ts"],"sourcesContent":["import { defaultFlags, defaultParameters } from \"./defaults.js\";\n\nimport { parser } from \"@node-cli/parser\";\n\nexport type Flags = {\n\tboring?: boolean;\n\tdot?: boolean;\n\tignoreCase?: boolean;\n\tshort?: boolean;\n\tstats?: boolean;\n\tgrep?: string;\n\ttype?: string;\n\tignore?: string[];\n\tprintMode?: string;\n};\n\nexport type Parameters = {\n\tpath?: string;\n};\n\nexport type Configuration = {\n\tflags?: Flags;\n\tparameters?: Parameters;\n};\n\n/* istanbul ignore next */\nexport const config: Configuration = parser({\n\tmeta: import.meta,\n\texamples: [\n\t\t{\n\t\t\tcommand: 'search --type f --pattern \".jsx$\" src/',\n\t\t\tcomment:\n\t\t\t\t'## Find all files with the extension \".jsx\" in the \"src\" folder',\n\t\t},\n\t\t{\n\t\t\tcommand: 'search --type f --pattern \".sh$\" --command \"chmod +x\" bin/',\n\t\t\tcomment: `## Change the permissions to executable for all the files with\\n ## the extension \".sh\" found under the \"bin\" folder`,\n\t\t},\n\t\t{\n\t\t\tcommand: 'search --type f --pattern \".md$\" --grep \"Table of Content\"',\n\t\t\tcomment: `## Search in all the markdown files under the \"src\" folder for\\n ## the keywords \"Table of Content\"`,\n\t\t},\n\t],\n\tflags: {\n\t\tboring: {\n\t\t\tshortFlag: \"b\",\n\t\t\tdefault: defaultFlags.boring,\n\t\t\tdescription: \"Do not use color output\",\n\t\t\ttype: \"boolean\",\n\t\t},\n\t\tcommand: {\n\t\t\tshortFlag: \"c\",\n\t\t\tdescription: \"Command to execute over each node (ex: chmod +x)\",\n\t\t\ttype: \"string\",\n\t\t},\n\t\tdot: {\n\t\t\tdefault: defaultFlags.dot,\n\t\t\tdescription: \"Show hidden files and directories\",\n\t\t\ttype: \"boolean\",\n\t\t},\n\t\tgrep: {\n\t\t\tshortFlag: \"g\",\n\t\t\tdescription: \"A RegExp to match the content of the files found\",\n\t\t\ttype: \"string\",\n\t\t},\n\t\thelp: {\n\t\t\tshortFlag: \"h\",\n\t\t\tdescription: \"Display help instructions\",\n\t\t\ttype: \"boolean\",\n\t\t},\n\t\tignoreCase: {\n\t\t\tshortFlag: \"i\",\n\t\t\tdefault: defaultFlags.ignoreCase,\n\t\t\tdescription: \"Ignore case when searching\",\n\t\t\ttype: \"boolean\",\n\t\t},\n\t\tpattern: {\n\t\t\tshortFlag: \"p\",\n\t\t\tdescription: \"A regular expression to match file or folder names\",\n\t\t\ttype: \"string\",\n\t\t},\n\t\tshort: {\n\t\t\tdefault: defaultFlags.short,\n\t\t\tdescription: \"Short listing format (equivalent to ls)\",\n\t\t\ttype: \"boolean\",\n\t\t},\n\t\tstats: {\n\t\t\tshortFlag: \"s\",\n\t\t\tdefault: defaultFlags.stats,\n\t\t\tdescription: \"Display some statistics\",\n\t\t\ttype: \"boolean\",\n\t\t},\n\t\ttype: {\n\t\t\tshortFlag: \"t\",\n\t\t\tdefault: \"both\",\n\t\t\tdescription: \"Search for files (f) or directories (d)\",\n\t\t\ttype: \"string\",\n\t\t},\n\t\tversion: {\n\t\t\tshortFlag: \"v\",\n\t\t\tdescription: \"Output the current version\",\n\t\t\ttype: \"boolean\",\n\t\t},\n\t\tignoreExtension: {\n\t\t\tshortFlag: \"I\",\n\t\t\tdescription: \"Ignore files extension, can be used multiple times\",\n\t\t\ttype: \"string\",\n\t\t\tisMultiple: true,\n\t\t},\n\t\tignoreFile: {\n\t\t\tshortFlag: \"F\",\n\t\t\tdescription: \"Ignore files name, can be used multiple times\",\n\t\t\ttype: \"string\",\n\t\t\tisMultiple: true,\n\t\t},\n\t\tignoreFolder: {\n\t\t\tshortFlag: \"D\",\n\t\t\tdescription: \"Ignore folders name, can be used multiple times\",\n\t\t\ttype: \"string\",\n\t\t\tisMultiple: true,\n\t\t},\n\t\tprintMode: {\n\t\t\tshortFlag: \"P\",\n\t\t\tdescription: \"Print mode (simple or xml)\",\n\t\t\ttype: \"string\",\n\t\t},\n\t\tignoreGitIgnore: {\n\t\t\tdescription: \"Ignore .gitignore files\",\n\t\t\tdefault: defaultFlags.ignoreGitIgnore,\n\t\t\ttype: \"boolean\",\n\t\t},\n\t},\n\tparameters: {\n\t\tpath: {\n\t\t\tdefault: \"current folder\",\n\t\t\tdescription: \"the path where to start the search\",\n\t\t},\n\t},\n\tusage: \"search [options] [path]\",\n\tdefaultFlags,\n\tdefaultParameters,\n});\n"],"names":["defaultFlags","defaultParameters","parser","config","meta","examples","command","comment","flags","boring","shortFlag","default","description","type","dot","grep","help","ignoreCase","pattern","short","stats","version","ignoreExtension","isMultiple","ignoreFile","ignoreFolder","printMode","ignoreGitIgnore","parameters","path","usage"],"mappings":"AAAA,SAASA,YAAY,EAAEC,iBAAiB,QAAQ,gBAAgB;AAEhE,SAASC,MAAM,QAAQ,mBAAmB;AAuB1C,wBAAwB,GACxB,OAAO,MAAMC,SAAwBD,OAAO;IAC3CE,MAAM;IACNC,UAAU;QACT;YACCC,SAAS;YACTC,SACC;QACF;QACA;YACCD,SAAS;YACTC,SAAS,CAAC,uHAAuH,CAAC;QACnI;QACA;YACCD,SAAS;YACTC,SAAS,CAAC,sGAAsG,CAAC;QAClH;KACA;IACDC,OAAO;QACNC,QAAQ;YACPC,WAAW;YACXC,SAASX,aAAaS,MAAM;YAC5BG,aAAa;YACbC,MAAM;QACP;QACAP,SAAS;YACRI,WAAW;YACXE,aAAa;YACbC,MAAM;QACP;QACAC,KAAK;YACJH,SAASX,aAAac,GAAG;YACzBF,aAAa;YACbC,MAAM;QACP;QACAE,MAAM;YACLL,WAAW;YACXE,aAAa;YACbC,MAAM;QACP;QACAG,MAAM;YACLN,WAAW;YACXE,aAAa;YACbC,MAAM;QACP;QACAI,YAAY;YACXP,WAAW;YACXC,SAASX,aAAaiB,UAAU;YAChCL,aAAa;YACbC,MAAM;QACP;QACAK,SAAS;YACRR,WAAW;YACXE,aAAa;YACbC,MAAM;QACP;QACAM,OAAO;YACNR,SAASX,aAAamB,KAAK;YAC3BP,aAAa;YACbC,MAAM;QACP;QACAO,OAAO;YACNV,WAAW;YACXC,SAASX,aAAaoB,KAAK;YAC3BR,aAAa;YACbC,MAAM;QACP;QACAA,MAAM;YACLH,WAAW;YACXC,SAAS;YACTC,aAAa;YACbC,MAAM;QACP;QACAQ,SAAS;YACRX,WAAW;YACXE,aAAa;YACbC,MAAM;QACP;QACAS,iBAAiB;YAChBZ,WAAW;YACXE,aAAa;YACbC,MAAM;YACNU,YAAY;QACb;QACAC,YAAY;YACXd,WAAW;YACXE,aAAa;YACbC,MAAM;YACNU,YAAY;QACb;QACAE,cAAc;YACbf,WAAW;YACXE,aAAa;YACbC,MAAM;YACNU,YAAY;QACb;QACAG,WAAW;YACVhB,WAAW;YACXE,aAAa;YACbC,MAAM;QACP;QACAc,iBAAiB;YAChBf,aAAa;YACbD,SAASX,aAAa2B,eAAe;YACrCd,MAAM;QACP;IACD;IACAe,YAAY;QACXC,MAAM;YACLlB,SAAS;YACTC,aAAa;QACd;IACD;IACAkB,OAAO;IACP9B;IACAC;AACD,GAAG"}
package/dist/search.js CHANGED
@@ -24,8 +24,7 @@ if (config.flags.grep) {
24
24
  }
25
25
  const search = new Search({
26
26
  ...config.flags,
27
- path: customPath,
28
- foldersBlacklist: /node_modules/gi
27
+ path: customPath
29
28
  });
30
29
  await search.start();
31
30
 
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/search.ts"],"sourcesContent":["#!/usr/bin/env node\n/* istanbul ignore file */\n\nimport path from \"node:path\";\nimport { Logger } from \"@node-cli/logger\";\nimport fs from \"fs-extra\";\nimport { Search } from \"./core.js\";\nimport { config } from \"./parse.js\";\nimport { STR_TYPE_FILE } from \"./utilities.js\";\n\nconst logger = new Logger({\n\tboring: process.env.NODE_ENV === \"test\",\n});\n\nlet customPath = config.parameters[0];\nif (fs.pathExistsSync(customPath)) {\n\tcustomPath = path.resolve(customPath);\n} else {\n\tlogger.printErrorsAndExit([`Folder ${customPath} does not exist!`], 0);\n}\n\nif (config.flags.grep) {\n\t// forcing simplified display if grep is true.\n\tconfig.flags.short = true;\n\t// And forcing type to files\n\tconfig.flags.type = STR_TYPE_FILE;\n}\n\nconst search = new Search({\n\t...config.flags,\n\tpath: customPath,\n\tfoldersBlacklist: /node_modules/gi,\n});\n\nawait search.start();\n"],"names":["path","Logger","fs","Search","config","STR_TYPE_FILE","logger","boring","process","env","NODE_ENV","customPath","parameters","pathExistsSync","resolve","printErrorsAndExit","flags","grep","short","type","search","foldersBlacklist","start"],"mappings":";AACA,wBAAwB,GAExB,OAAOA,UAAU,YAAY;AAC7B,SAASC,MAAM,QAAQ,mBAAmB;AAC1C,OAAOC,QAAQ,WAAW;AAC1B,SAASC,MAAM,QAAQ,YAAY;AACnC,SAASC,MAAM,QAAQ,aAAa;AACpC,SAASC,aAAa,QAAQ,iBAAiB;AAE/C,MAAMC,SAAS,IAAIL,OAAO;IACzBM,QAAQC,QAAQC,GAAG,CAACC,QAAQ,KAAK;AAClC;AAEA,IAAIC,aAAaP,OAAOQ,UAAU,CAAC,EAAE;AACrC,IAAIV,GAAGW,cAAc,CAACF,aAAa;IAClCA,aAAaX,KAAKc,OAAO,CAACH;AAC3B,OAAO;IACNL,OAAOS,kBAAkB,CAAC;QAAC,CAAC,OAAO,EAAEJ,WAAW,gBAAgB,CAAC;KAAC,EAAE;AACrE;AAEA,IAAIP,OAAOY,KAAK,CAACC,IAAI,EAAE;IACtB,8CAA8C;IAC9Cb,OAAOY,KAAK,CAACE,KAAK,GAAG;IACrB,4BAA4B;IAC5Bd,OAAOY,KAAK,CAACG,IAAI,GAAGd;AACrB;AAEA,MAAMe,SAAS,IAAIjB,OAAO;IACzB,GAAGC,OAAOY,KAAK;IACfhB,MAAMW;IACNU,kBAAkB;AACnB;AAEA,MAAMD,OAAOE,KAAK"}
1
+ {"version":3,"sources":["../src/search.ts"],"sourcesContent":["#!/usr/bin/env node\n/* istanbul ignore file */\n\nimport path from \"node:path\";\nimport { Logger } from \"@node-cli/logger\";\nimport fs from \"fs-extra\";\nimport { Search } from \"./core.js\";\nimport { config } from \"./parse.js\";\nimport { STR_TYPE_FILE } from \"./utilities.js\";\n\nconst logger = new Logger({\n\tboring: process.env.NODE_ENV === \"test\",\n});\n\nlet customPath = config.parameters[0];\nif (fs.pathExistsSync(customPath)) {\n\tcustomPath = path.resolve(customPath);\n} else {\n\tlogger.printErrorsAndExit([`Folder ${customPath} does not exist!`], 0);\n}\n\nif (config.flags.grep) {\n\t// forcing simplified display if grep is true.\n\tconfig.flags.short = true;\n\t// And forcing type to files\n\tconfig.flags.type = STR_TYPE_FILE;\n}\n\nconst search = new Search({\n\t...config.flags,\n\tpath: customPath,\n});\n\nawait search.start();\n"],"names":["path","Logger","fs","Search","config","STR_TYPE_FILE","logger","boring","process","env","NODE_ENV","customPath","parameters","pathExistsSync","resolve","printErrorsAndExit","flags","grep","short","type","search","start"],"mappings":";AACA,wBAAwB,GAExB,OAAOA,UAAU,YAAY;AAC7B,SAASC,MAAM,QAAQ,mBAAmB;AAC1C,OAAOC,QAAQ,WAAW;AAC1B,SAASC,MAAM,QAAQ,YAAY;AACnC,SAASC,MAAM,QAAQ,aAAa;AACpC,SAASC,aAAa,QAAQ,iBAAiB;AAE/C,MAAMC,SAAS,IAAIL,OAAO;IACzBM,QAAQC,QAAQC,GAAG,CAACC,QAAQ,KAAK;AAClC;AAEA,IAAIC,aAAaP,OAAOQ,UAAU,CAAC,EAAE;AACrC,IAAIV,GAAGW,cAAc,CAACF,aAAa;IAClCA,aAAaX,KAAKc,OAAO,CAACH;AAC3B,OAAO;IACNL,OAAOS,kBAAkB,CAAC;QAAC,CAAC,OAAO,EAAEJ,WAAW,gBAAgB,CAAC;KAAC,EAAE;AACrE;AAEA,IAAIP,OAAOY,KAAK,CAACC,IAAI,EAAE;IACtB,8CAA8C;IAC9Cb,OAAOY,KAAK,CAACE,KAAK,GAAG;IACrB,4BAA4B;IAC5Bd,OAAOY,KAAK,CAACG,IAAI,GAAGd;AACrB;AAEA,MAAMe,SAAS,IAAIjB,OAAO;IACzB,GAAGC,OAAOY,KAAK;IACfhB,MAAMW;AACP;AAEA,MAAMS,OAAOC,KAAK"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@node-cli/search",
3
- "version": "2.0.0",
3
+ "version": "3.0.0",
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": "f1e5f0c51f635b9b98043d843a5025533bdb4a21"
41
+ "gitHead": "0ca585eac6d0052eb2a2b41f6910572cc68c233f"
42
42
  }