@node-cli/search 1.0.1 → 1.0.3

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/README.md CHANGED
@@ -9,6 +9,8 @@
9
9
 
10
10
  ## Installation
11
11
 
12
+ This command line utility can be installed globally or locally within your project. It does make more sense to have it installed globally though, since it then can be use anywhere by simply starting it to search files and folders located in the current folder.
13
+
12
14
  ```sh
13
15
  > npm install --global @node-cli/search
14
16
  ```
@@ -38,3 +40,7 @@ Get help
38
40
  ```sh
39
41
  > search --help
40
42
  ```
43
+
44
+ ## License
45
+
46
+ MIT © Arno Versini
package/dist/core.js CHANGED
@@ -28,7 +28,7 @@ export class Search {
28
28
  totalFileFound;
29
29
  totalFileScanned;
30
30
  type;
31
- constructor({ boring , command , dot , foldersBlacklist , grep , ignoreCase , short , path , pattern , stats , type }){
31
+ constructor({ boring, command, dot, foldersBlacklist, grep, ignoreCase, short, path, pattern, stats, type }){
32
32
  this.path = path;
33
33
  this.rePattern = pattern ? new RegExp(pattern, ignoreCase ? "i" : "") : undefined;
34
34
  this.type = type || STR_TYPE_BOTH;
@@ -157,7 +157,7 @@ export class Search {
157
157
  const match = node.match ? new RegExp(node.match, "g") : node.match;
158
158
  name = color(name.replace(match, kleur.black().bgYellow(node.match)));
159
159
  if (this.grep && node.type === STR_TYPE_FILE) {
160
- const { totalMatchingLines , results } = await runGrepOnNode(node.name, this.grep);
160
+ const { totalMatchingLines, results } = await runGrepOnNode(node.name, this.grep);
161
161
  /* istanbul ignore else */ if (totalMatchingLines) {
162
162
  this.totalFileFound++;
163
163
  const occurrences = plur("occurrence", totalMatchingLines);
package/dist/core.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/core.ts"],"sourcesContent":["import {\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\";\nimport { basename, join, relative } from \"node:path\";\n\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\";\nimport { promisify } from \"node:util\";\n\nconst lstatAsync = promisify(fs.lstat);\nconst readdirAsync = promisify(fs.readdir);\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\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}: {\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}) {\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\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\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() {\n\t\tif (this.displayStats) {\n\t\t\tperf.start();\n\t\t}\n\t\tawait this.scanFileSystem([this.path]);\n\t\tawait this.postProcessResults();\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}\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\tif (stat && stat.isDirectory() && !this.ignoreFolders(node)) {\n\t\t\t\tthis.totalDirScanned++;\n\n\t\t\t\tif ((result = checkPattern(this.rePattern, node))) {\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 (stat && stat.isFile()) {\n\t\t\t\tthis.totalFileScanned++;\n\t\t\t\tshortname = basename(node);\n\t\t\t\tif ((result = checkPattern(this.rePattern, shortname))) {\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: result[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 postProcessResults() {\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\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\t\t\t\tconst match = node.match ? new RegExp(node.match, \"g\") : node.match;\n\t\t\t\tname = color(name.replace(match, kleur.black().bgYellow(node.match)));\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\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":["STR_TYPE_BOTH","STR_TYPE_DIRECTORY","STR_TYPE_FILE","checkPattern","formatLongListings","printStatistics","runCommandOnNode","runGrepOnNode","basename","join","relative","Logger","Performance","fs","kleur","plur","promisify","lstatAsync","lstat","readdirAsync","readdir","perf","logger","boring","process","env","NODE_ENV","Search","command","displayHiddenFilesAndFolders","displayLongListing","displayStats","foldersBlacklist","grep","nodesList","path","rePattern","totalDirFound","totalDirScanned","totalFileFound","totalFileScanned","type","constructor","dot","ignoreCase","short","pattern","stats","RegExp","undefined","enabled","trim","error","exit","ignoreFolders","directory","lastIndex","test","filterHidden","value","start","scanFileSystem","postProcessResults","stop","duration","results","totalDirsFound","totalFilesFound","nodes","node","result","files","shortname","stat","isDirectory","push","match","name","filter","element","map","file","isFile","log","list","group","mdate","mode","owner","size","separator","color","gray","blue","cwd","replace","black","bgYellow","totalMatchingLines","occurrences","white"],"mappings":"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"}
1
+ {"version":3,"sources":["../src/core.ts"],"sourcesContent":["import {\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\";\nimport { basename, join, relative } from \"node:path\";\n\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\";\nimport { promisify } from \"node:util\";\n\nconst lstatAsync = promisify(fs.lstat);\nconst readdirAsync = promisify(fs.readdir);\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\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}: {\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}) {\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\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\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() {\n\t\tif (this.displayStats) {\n\t\t\tperf.start();\n\t\t}\n\t\tawait this.scanFileSystem([this.path]);\n\t\tawait this.postProcessResults();\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}\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\tif (stat && stat.isDirectory() && !this.ignoreFolders(node)) {\n\t\t\t\tthis.totalDirScanned++;\n\n\t\t\t\tif ((result = checkPattern(this.rePattern, node))) {\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 (stat && stat.isFile()) {\n\t\t\t\tthis.totalFileScanned++;\n\t\t\t\tshortname = basename(node);\n\t\t\t\tif ((result = checkPattern(this.rePattern, shortname))) {\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: result[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 postProcessResults() {\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\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\t\t\t\tconst match = node.match ? new RegExp(node.match, \"g\") : node.match;\n\t\t\t\tname = color(name.replace(match, kleur.black().bgYellow(node.match)));\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\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":["STR_TYPE_BOTH","STR_TYPE_DIRECTORY","STR_TYPE_FILE","checkPattern","formatLongListings","printStatistics","runCommandOnNode","runGrepOnNode","basename","join","relative","Logger","Performance","fs","kleur","plur","promisify","lstatAsync","lstat","readdirAsync","readdir","perf","logger","boring","process","env","NODE_ENV","Search","command","displayHiddenFilesAndFolders","displayLongListing","displayStats","foldersBlacklist","grep","nodesList","path","rePattern","totalDirFound","totalDirScanned","totalFileFound","totalFileScanned","type","constructor","dot","ignoreCase","short","pattern","stats","RegExp","undefined","enabled","trim","error","exit","ignoreFolders","directory","lastIndex","test","filterHidden","value","start","scanFileSystem","postProcessResults","stop","duration","results","totalDirsFound","totalFilesFound","nodes","node","result","files","shortname","stat","isDirectory","push","match","name","filter","element","map","file","isFile","log","list","group","mdate","mode","owner","size","separator","color","gray","blue","cwd","replace","black","bgYellow","totalMatchingLines","occurrences","white"],"mappings":"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"}
@@ -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};\n\nexport const defaultParameters = {\n\t\"0\": process.cwd(),\n};\n"],"names":["defaultFlags","boring","dot","ignoreCase","short","stats","defaultParameters","process","cwd"],"mappings":"AAAA,OAAO,MAAMA,eAAe;IAC3BC,QAAQ;IACRC,KAAK;IACLC,YAAY;IACZC,OAAO;IACPC,OAAO;AACR,EAAE;AAEF,OAAO,MAAMC,oBAAoB;IAChC,KAAKC,QAAQC;AACd,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};\n\nexport const defaultParameters = {\n\t\"0\": process.cwd(),\n};\n"],"names":["defaultFlags","boring","dot","ignoreCase","short","stats","defaultParameters","process","cwd"],"mappings":"AAAA,OAAO,MAAMA,eAAe;IAC3BC,QAAQ;IACRC,KAAK;IACLC,YAAY;IACZC,OAAO;IACPC,OAAO;AACR,EAAE;AAEF,OAAO,MAAMC,oBAAoB;IAChC,KAAKC,QAAQC,GAAG;AACjB,EAAE"}
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};\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},\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","parameters","path","usage"],"mappings":"AAAA,SAASA,YAAY,EAAEC,iBAAiB,QAAQ,gBAAgB;AAEhE,SAASC,MAAM,QAAQ,mBAAmB;AAqB1C,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;YACtBG,aAAa;YACbC,MAAM;QACP;QACAP,SAAS;YACRI,WAAW;YACXE,aAAa;YACbC,MAAM;QACP;QACAC,KAAK;YACJH,SAASX,aAAac;YACtBF,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;YACtBL,aAAa;YACbC,MAAM;QACP;QACAK,SAAS;YACRR,WAAW;YACXE,aAAa;YACbC,MAAM;QACP;QACAM,OAAO;YACNR,SAASX,aAAamB;YACtBP,aAAa;YACbC,MAAM;QACP;QACAO,OAAO;YACNV,WAAW;YACXC,SAASX,aAAaoB;YACtBR,aAAa;YACbC,MAAM;QACP;QACAA,MAAM;YACLH,WAAW;YACXC,SAAS;YACTC,aAAa;YACbC,MAAM;QACP;QACAQ,SAAS;YACRX,WAAW;YACXE,aAAa;YACbC,MAAM;QACP;IACD;IACAS,YAAY;QACXC,MAAM;YACLZ,SAAS;YACTC,aAAa;QACd;IACD;IACAY,OAAO;IACPxB;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};\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},\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","parameters","path","usage"],"mappings":"AAAA,SAASA,YAAY,EAAEC,iBAAiB,QAAQ,gBAAgB;AAEhE,SAASC,MAAM,QAAQ,mBAAmB;AAqB1C,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;IACD;IACAS,YAAY;QACXC,MAAM;YACLZ,SAAS;YACTC,aAAa;QACd;IACD;IACAY,OAAO;IACPxB;IACAC;AACD,GAAG"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/search.ts"],"sourcesContent":["#!/usr/bin/env node\n/* istanbul ignore file */\n\nimport { Logger } from \"@node-cli/logger\";\nimport { STR_TYPE_FILE } from \"./utilities.js\";\nimport { Search } from \"./core.js\";\nimport { config } from \"./parse.js\";\nimport fs from \"fs-extra\";\nimport path from \"node:path\";\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":["Logger","STR_TYPE_FILE","Search","config","fs","path","logger","boring","process","env","NODE_ENV","customPath","parameters","pathExistsSync","resolve","printErrorsAndExit","flags","grep","short","type","search","foldersBlacklist","start"],"mappings":";AACA,wBAAwB,GAExB,SAASA,MAAM,QAAQ,mBAAmB;AAC1C,SAASC,aAAa,QAAQ,iBAAiB;AAC/C,SAASC,MAAM,QAAQ,YAAY;AACnC,SAASC,MAAM,QAAQ,aAAa;AACpC,OAAOC,QAAQ,WAAW;AAC1B,OAAOC,UAAU,YAAY;AAE7B,MAAMC,SAAS,IAAIN,OAAO;IACzBO,QAAQC,QAAQC,IAAIC,aAAa;AAClC;AAEA,IAAIC,aAAaR,OAAOS,UAAU,CAAC,EAAE;AACrC,IAAIR,GAAGS,eAAeF,aAAa;IAClCA,aAAaN,KAAKS,QAAQH;AAC3B,OAAO;IACNL,OAAOS,mBAAmB;QAAC,CAAC,OAAO,EAAEJ,WAAW,gBAAgB,CAAC;KAAC,EAAE;AACrE;AAEA,IAAIR,OAAOa,MAAMC,MAAM;IACtB,8CAA8C;IAC9Cd,OAAOa,MAAME,QAAQ;IACrB,4BAA4B;IAC5Bf,OAAOa,MAAMG,OAAOlB;AACrB;AAEA,MAAMmB,SAAS,IAAIlB,OAAO;IACzB,GAAGC,OAAOa,KAAK;IACfX,MAAMM;IACNU,kBAAkB;AACnB;AAEA,MAAMD,OAAOE"}
1
+ {"version":3,"sources":["../src/search.ts"],"sourcesContent":["#!/usr/bin/env node\n/* istanbul ignore file */\n\nimport { Logger } from \"@node-cli/logger\";\nimport { STR_TYPE_FILE } from \"./utilities.js\";\nimport { Search } from \"./core.js\";\nimport { config } from \"./parse.js\";\nimport fs from \"fs-extra\";\nimport path from \"node:path\";\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":["Logger","STR_TYPE_FILE","Search","config","fs","path","logger","boring","process","env","NODE_ENV","customPath","parameters","pathExistsSync","resolve","printErrorsAndExit","flags","grep","short","type","search","foldersBlacklist","start"],"mappings":";AACA,wBAAwB,GAExB,SAASA,MAAM,QAAQ,mBAAmB;AAC1C,SAASC,aAAa,QAAQ,iBAAiB;AAC/C,SAASC,MAAM,QAAQ,YAAY;AACnC,SAASC,MAAM,QAAQ,aAAa;AACpC,OAAOC,QAAQ,WAAW;AAC1B,OAAOC,UAAU,YAAY;AAE7B,MAAMC,SAAS,IAAIN,OAAO;IACzBO,QAAQC,QAAQC,GAAG,CAACC,QAAQ,KAAK;AAClC;AAEA,IAAIC,aAAaR,OAAOS,UAAU,CAAC,EAAE;AACrC,IAAIR,GAAGS,cAAc,CAACF,aAAa;IAClCA,aAAaN,KAAKS,OAAO,CAACH;AAC3B,OAAO;IACNL,OAAOS,kBAAkB,CAAC;QAAC,CAAC,OAAO,EAAEJ,WAAW,gBAAgB,CAAC;KAAC,EAAE;AACrE;AAEA,IAAIR,OAAOa,KAAK,CAACC,IAAI,EAAE;IACtB,8CAA8C;IAC9Cd,OAAOa,KAAK,CAACE,KAAK,GAAG;IACrB,4BAA4B;IAC5Bf,OAAOa,KAAK,CAACG,IAAI,GAAGlB;AACrB;AAEA,MAAMmB,SAAS,IAAIlB,OAAO;IACzB,GAAGC,OAAOa,KAAK;IACfX,MAAMM;IACNU,kBAAkB;AACnB;AAEA,MAAMD,OAAOE,KAAK"}
package/dist/utilities.js CHANGED
@@ -101,7 +101,7 @@ export const formatLongListings = async (stat, type)=>({
101
101
  owner: `${await getOwnerNameFromId(stat.uid)}`,
102
102
  size: `${convertSize(stat.size)}`
103
103
  });
104
- export const printStatistics = ({ duration , totalDirScanned , totalDirsFound , totalFileScanned , totalFilesFound , type , pattern , grep })=>{
104
+ export const printStatistics = ({ duration, totalDirScanned, totalDirsFound, totalFileScanned, totalFilesFound, type, pattern, grep })=>{
105
105
  let message = `Total folders scanned: ${kleur.yellow(totalDirScanned)}\n`;
106
106
  message += `Total files scanned: ${kleur.yellow(totalFileScanned)}\n`;
107
107
  switch(type){
@@ -139,7 +139,7 @@ export const checkPattern = (rePattern, string_)=>{
139
139
  };
140
140
  export const runCommandOnNode = async (node, command)=>{
141
141
  try {
142
- const { stdout } = await run(`${command} ${node}`);
142
+ const { stdout } = await run(`${command} ${node}`);
143
143
  if (stdout) {
144
144
  logger.log(stdout);
145
145
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/utilities.ts"],"sourcesContent":["import { RunResult, run } from \"@node-cli/run\";\n\nimport { Logger } from \"@node-cli/logger\";\nimport fs from \"node:fs\";\nimport kleur from \"kleur\";\nimport prettyMilliseconds from \"pretty-ms\";\n\nconst BYTE_CHUNKS = 1000;\nconst DECIMAL = 10;\nconst LAST_THREE_ENTRIES = -3;\nconst MODE_GROUP_POS = 1;\nconst MODE_OWNER_POS = 0;\nconst MODE_WORD_POS = 2;\nconst OCTAL = 8;\nexport const STR_TYPE_DIRECTORY = \"d\";\nexport const STR_TYPE_FILE = \"f\";\nexport const STR_TYPE_BOTH = \"both\";\nconst PERMISSIONS_PREFIX = {\n\t[STR_TYPE_DIRECTORY]: \"d\",\n\t[STR_TYPE_FILE]: \"-\",\n};\n\nconst ownerNames = {\n\t0: \"root\",\n};\n\nconst MONTHS = {\n\t0: \"Jan\",\n\t1: \"Feb\",\n\t2: \"Mar\",\n\t3: \"Apr\",\n\t4: \"May\",\n\t5: \"Jun\",\n\t6: \"Jul\",\n\t7: \"Aug\",\n\t8: \"Sep\",\n\t9: \"Oct\",\n\t10: \"Nov\",\n\t11: \"Dec\",\n};\n\nconst logger = new Logger({\n\tboring: process.env.NODE_ENV === \"test\",\n});\n\nexport const extractMode = (mode: number): string => {\n\tconst modeDec = Number.parseInt(mode.toString(OCTAL), DECIMAL)\n\t\t.toString()\n\t\t.slice(LAST_THREE_ENTRIES);\n\tconst modeOwner = modeDec.charAt(MODE_OWNER_POS);\n\tconst modeGroup = modeDec.charAt(MODE_GROUP_POS);\n\tconst modeWorld = modeDec.charAt(MODE_WORD_POS);\n\tconst modes = {\n\t\t0: \"---\",\n\t\t1: \"--x\",\n\t\t2: \"-w-\",\n\t\t3: \"-wx\",\n\t\t4: \"r--\",\n\t\t5: \"r-x\",\n\t\t6: \"rw-\",\n\t\t7: \"rwx\",\n\t};\n\treturn modes[modeOwner] + modes[modeGroup] + modes[modeWorld];\n};\n\nexport const convertSize = (bytes: number): string => {\n\tconst sizes = [\"B\", \"K\", \"M\", \"G\", \"T\"];\n\tconst length = 5;\n\tlet posttxt = 0;\n\n\twhile (bytes >= BYTE_CHUNKS) {\n\t\tposttxt = posttxt + 1;\n\t\tbytes = bytes / BYTE_CHUNKS;\n\t}\n\tconst string_ =\n\t\tNumber.parseInt(bytes.toString(), DECIMAL).toFixed(0) + sizes[posttxt];\n\treturn (\n\t\tArray.from({ length: length + 1 - string_.length }).join(\" \") + string_\n\t);\n};\n\nexport const convertDate = (mtime: Date): string => {\n\tconst month = MONTHS[mtime.getMonth()];\n\tconst date = `${mtime.getDate()}`.padStart(2, \"0\");\n\tconst hours = `${mtime.getHours()}`.padStart(2, \"0\");\n\tconst minutes = `${mtime.getMinutes()}`.padStart(2, \"0\");\n\treturn `${month} ${date} ${hours}:${minutes}`;\n};\n\nexport const getOwnerNameFromId = async (\n\tuid: string | number\n): Promise<string | number> => {\n\tlet result: RunResult;\n\n\t/* istanbul ignore else */\n\tif (ownerNames[uid]) {\n\t\treturn ownerNames[uid];\n\t} else {\n\t\ttry {\n\t\t\tresult = await run(`id -nu ${uid}`);\n\t\t\townerNames[uid] = result.stdout;\n\t\t\treturn result.stdout;\n\t\t} catch {\n\t\t\t// nothing to declare officer\n\t\t\treturn `${uid}`;\n\t\t}\n\t}\n};\n\nexport const formatLongListings = async (\n\tstat: { mtime: Date; mode: number; uid: string | number; size: number },\n\ttype: string\n): Promise<{\n\tmdate: string;\n\tmode: string;\n\towner: string;\n\tsize: string;\n}> => ({\n\tmdate: `${convertDate(stat.mtime)}`,\n\tmode: PERMISSIONS_PREFIX[type] + extractMode(stat.mode),\n\towner: `${await getOwnerNameFromId(stat.uid)}`,\n\tsize: `${convertSize(stat.size)}`,\n});\n\nexport type Statistics = {\n\tduration?: number;\n\ttotalDirScanned?: number;\n\ttotalDirsFound?: number;\n\ttotalFileScanned?: number;\n\ttotalFilesFound?: number;\n\ttype?: string;\n\tpattern?: boolean | RegExp;\n\tgrep?: boolean | RegExp | string;\n};\nexport const printStatistics = ({\n\tduration,\n\ttotalDirScanned,\n\ttotalDirsFound,\n\ttotalFileScanned,\n\ttotalFilesFound,\n\ttype,\n\tpattern,\n\tgrep,\n}: Statistics) => {\n\tlet message = `Total folders scanned: ${kleur.yellow(totalDirScanned)}\\n`;\n\tmessage += `Total files scanned: ${kleur.yellow(totalFileScanned)}\\n`;\n\tswitch (type) {\n\t\tcase STR_TYPE_DIRECTORY: {\n\t\t\tmessage += `Total folders matching: ${kleur.green(totalDirsFound)}\\n`;\n\t\t\tbreak;\n\t\t}\n\n\t\tcase STR_TYPE_FILE: {\n\t\t\tmessage += `Total files matching: ${kleur.green(totalFilesFound)}\\n`;\n\t\t\tbreak;\n\t\t}\n\n\t\tdefault: {\n\t\t\tif (pattern) {\n\t\t\t\tmessage += `Total folders matching: ${kleur.green(totalDirsFound)}\\n`;\n\t\t\t\tmessage += `Total files matching: ${kleur.green(totalFilesFound)}\\n`;\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t}\n\n\tmessage += `Duration: ${kleur.yellow(`${prettyMilliseconds(duration)}`)}`;\n\tif (!grep) {\n\t\tlogger.log();\n\t}\n\tlogger.printBox(message);\n};\n\nexport const checkPattern = (\n\trePattern: RegExp | undefined,\n\tstring_: string\n): boolean | RegExpExecArray => {\n\tif (rePattern) {\n\t\trePattern.lastIndex = 0;\n\t\treturn rePattern.exec(string_);\n\t}\n\treturn true;\n};\n\nexport const runCommandOnNode = async (node: string, command: string) => {\n\ttry {\n\t\tconst { stdout } = await run(`${command} ${node}`);\n\t\tif (stdout) {\n\t\t\tlogger.log(stdout);\n\t\t}\n\t} catch {\n\t\t// nothing to declare officer\n\t}\n};\n\nexport type RunGrepOnNode = {\n\tresults: (string | number)[];\n\ttotalMatchingLines: number;\n};\nexport const runGrepOnNode = async (\n\tnode?: string,\n\trePattern?: RegExp\n): Promise<RunGrepOnNode> => {\n\ttry {\n\t\tconst lines = [];\n\t\tlet totalMatchingLines = 0;\n\t\tconst buffer = fs.readFileSync(node, \"utf8\").split(\"\\n\");\n\n\t\tfor (const [lineNumber, line] of buffer.entries()) {\n\t\t\tlet result: (string | number)[];\n\t\t\trePattern.lastIndex = 0;\n\t\t\tif (!(result = rePattern.exec(line))) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\ttotalMatchingLines++;\n\t\t\tif (lineNumber > 0) {\n\t\t\t\tlines.push(`${lineNumber}: ${kleur.grey(buffer[lineNumber - 1])}`);\n\t\t\t}\n\t\t\tlines.push(\n\t\t\t\t`${lineNumber + 1}: ${kleur.grey(\n\t\t\t\t\tline.replace(rePattern, kleur.black().bgYellow(result[0]))\n\t\t\t\t)}`,\n\t\t\t\t`${lineNumber + 2}: ${kleur.grey(buffer[lineNumber + 1])}`,\n\t\t\t\t\"\"\n\t\t\t);\n\t\t}\n\t\treturn {\n\t\t\tresults: lines.length > 0 ? lines : [],\n\t\t\ttotalMatchingLines,\n\t\t};\n\t} catch (error) {\n\t\t/* istanbul ignore next */\n\t\tlogger.error(error);\n\t}\n};\n"],"names":["run","Logger","fs","kleur","prettyMilliseconds","BYTE_CHUNKS","DECIMAL","LAST_THREE_ENTRIES","MODE_GROUP_POS","MODE_OWNER_POS","MODE_WORD_POS","OCTAL","STR_TYPE_DIRECTORY","STR_TYPE_FILE","STR_TYPE_BOTH","PERMISSIONS_PREFIX","ownerNames","MONTHS","logger","boring","process","env","NODE_ENV","extractMode","mode","modeDec","Number","parseInt","toString","slice","modeOwner","charAt","modeGroup","modeWorld","modes","convertSize","bytes","sizes","length","posttxt","string_","toFixed","Array","from","join","convertDate","mtime","month","getMonth","date","getDate","padStart","hours","getHours","minutes","getMinutes","getOwnerNameFromId","uid","result","stdout","formatLongListings","stat","type","mdate","owner","size","printStatistics","duration","totalDirScanned","totalDirsFound","totalFileScanned","totalFilesFound","pattern","grep","message","yellow","green","log","printBox","checkPattern","rePattern","lastIndex","exec","runCommandOnNode","node","command","runGrepOnNode","lines","totalMatchingLines","buffer","readFileSync","split","lineNumber","line","entries","push","grey","replace","black","bgYellow","results","error"],"mappings":"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"}
1
+ {"version":3,"sources":["../src/utilities.ts"],"sourcesContent":["import { RunResult, run } from \"@node-cli/run\";\n\nimport { Logger } from \"@node-cli/logger\";\nimport fs from \"node:fs\";\nimport kleur from \"kleur\";\nimport prettyMilliseconds from \"pretty-ms\";\n\nconst BYTE_CHUNKS = 1000;\nconst DECIMAL = 10;\nconst LAST_THREE_ENTRIES = -3;\nconst MODE_GROUP_POS = 1;\nconst MODE_OWNER_POS = 0;\nconst MODE_WORD_POS = 2;\nconst OCTAL = 8;\nexport const STR_TYPE_DIRECTORY = \"d\";\nexport const STR_TYPE_FILE = \"f\";\nexport const STR_TYPE_BOTH = \"both\";\nconst PERMISSIONS_PREFIX = {\n\t[STR_TYPE_DIRECTORY]: \"d\",\n\t[STR_TYPE_FILE]: \"-\",\n};\n\nconst ownerNames = {\n\t0: \"root\",\n};\n\nconst MONTHS = {\n\t0: \"Jan\",\n\t1: \"Feb\",\n\t2: \"Mar\",\n\t3: \"Apr\",\n\t4: \"May\",\n\t5: \"Jun\",\n\t6: \"Jul\",\n\t7: \"Aug\",\n\t8: \"Sep\",\n\t9: \"Oct\",\n\t10: \"Nov\",\n\t11: \"Dec\",\n};\n\nconst logger = new Logger({\n\tboring: process.env.NODE_ENV === \"test\",\n});\n\nexport const extractMode = (mode: number): string => {\n\tconst modeDec = Number.parseInt(mode.toString(OCTAL), DECIMAL)\n\t\t.toString()\n\t\t.slice(LAST_THREE_ENTRIES);\n\tconst modeOwner = modeDec.charAt(MODE_OWNER_POS);\n\tconst modeGroup = modeDec.charAt(MODE_GROUP_POS);\n\tconst modeWorld = modeDec.charAt(MODE_WORD_POS);\n\tconst modes = {\n\t\t0: \"---\",\n\t\t1: \"--x\",\n\t\t2: \"-w-\",\n\t\t3: \"-wx\",\n\t\t4: \"r--\",\n\t\t5: \"r-x\",\n\t\t6: \"rw-\",\n\t\t7: \"rwx\",\n\t};\n\treturn modes[modeOwner] + modes[modeGroup] + modes[modeWorld];\n};\n\nexport const convertSize = (bytes: number): string => {\n\tconst sizes = [\"B\", \"K\", \"M\", \"G\", \"T\"];\n\tconst length = 5;\n\tlet posttxt = 0;\n\n\twhile (bytes >= BYTE_CHUNKS) {\n\t\tposttxt = posttxt + 1;\n\t\tbytes = bytes / BYTE_CHUNKS;\n\t}\n\tconst string_ =\n\t\tNumber.parseInt(bytes.toString(), DECIMAL).toFixed(0) + sizes[posttxt];\n\treturn (\n\t\tArray.from({ length: length + 1 - string_.length }).join(\" \") + string_\n\t);\n};\n\nexport const convertDate = (mtime: Date): string => {\n\tconst month = MONTHS[mtime.getMonth()];\n\tconst date = `${mtime.getDate()}`.padStart(2, \"0\");\n\tconst hours = `${mtime.getHours()}`.padStart(2, \"0\");\n\tconst minutes = `${mtime.getMinutes()}`.padStart(2, \"0\");\n\treturn `${month} ${date} ${hours}:${minutes}`;\n};\n\nexport const getOwnerNameFromId = async (\n\tuid: string | number,\n): Promise<string | number> => {\n\tlet result: RunResult;\n\n\t/* istanbul ignore else */\n\tif (ownerNames[uid]) {\n\t\treturn ownerNames[uid];\n\t} else {\n\t\ttry {\n\t\t\tresult = await run(`id -nu ${uid}`);\n\t\t\townerNames[uid] = result.stdout;\n\t\t\treturn result.stdout;\n\t\t} catch {\n\t\t\t// nothing to declare officer\n\t\t\treturn `${uid}`;\n\t\t}\n\t}\n};\n\nexport const formatLongListings = async (\n\tstat: { mtime: Date; mode: number; uid: string | number; size: number },\n\ttype: string,\n): Promise<{\n\tmdate: string;\n\tmode: string;\n\towner: string;\n\tsize: string;\n}> => ({\n\tmdate: `${convertDate(stat.mtime)}`,\n\tmode: PERMISSIONS_PREFIX[type] + extractMode(stat.mode),\n\towner: `${await getOwnerNameFromId(stat.uid)}`,\n\tsize: `${convertSize(stat.size)}`,\n});\n\nexport type Statistics = {\n\tduration?: number;\n\ttotalDirScanned?: number;\n\ttotalDirsFound?: number;\n\ttotalFileScanned?: number;\n\ttotalFilesFound?: number;\n\ttype?: string;\n\tpattern?: boolean | RegExp;\n\tgrep?: boolean | RegExp | string;\n};\nexport const printStatistics = ({\n\tduration,\n\ttotalDirScanned,\n\ttotalDirsFound,\n\ttotalFileScanned,\n\ttotalFilesFound,\n\ttype,\n\tpattern,\n\tgrep,\n}: Statistics) => {\n\tlet message = `Total folders scanned: ${kleur.yellow(totalDirScanned)}\\n`;\n\tmessage += `Total files scanned: ${kleur.yellow(totalFileScanned)}\\n`;\n\tswitch (type) {\n\t\tcase STR_TYPE_DIRECTORY: {\n\t\t\tmessage += `Total folders matching: ${kleur.green(totalDirsFound)}\\n`;\n\t\t\tbreak;\n\t\t}\n\n\t\tcase STR_TYPE_FILE: {\n\t\t\tmessage += `Total files matching: ${kleur.green(totalFilesFound)}\\n`;\n\t\t\tbreak;\n\t\t}\n\n\t\tdefault: {\n\t\t\tif (pattern) {\n\t\t\t\tmessage += `Total folders matching: ${kleur.green(totalDirsFound)}\\n`;\n\t\t\t\tmessage += `Total files matching: ${kleur.green(totalFilesFound)}\\n`;\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t}\n\n\tmessage += `Duration: ${kleur.yellow(`${prettyMilliseconds(duration)}`)}`;\n\tif (!grep) {\n\t\tlogger.log();\n\t}\n\tlogger.printBox(message);\n};\n\nexport const checkPattern = (\n\trePattern: RegExp | undefined,\n\tstring_: string,\n): boolean | RegExpExecArray => {\n\tif (rePattern) {\n\t\trePattern.lastIndex = 0;\n\t\treturn rePattern.exec(string_);\n\t}\n\treturn true;\n};\n\nexport const runCommandOnNode = async (node: string, command: string) => {\n\ttry {\n\t\tconst { stdout } = await run(`${command} ${node}`);\n\t\tif (stdout) {\n\t\t\tlogger.log(stdout);\n\t\t}\n\t} catch {\n\t\t// nothing to declare officer\n\t}\n};\n\nexport type RunGrepOnNode = {\n\tresults: (string | number)[];\n\ttotalMatchingLines: number;\n};\nexport const runGrepOnNode = async (\n\tnode?: string,\n\trePattern?: RegExp,\n): Promise<RunGrepOnNode> => {\n\ttry {\n\t\tconst lines = [];\n\t\tlet totalMatchingLines = 0;\n\t\tconst buffer = fs.readFileSync(node, \"utf8\").split(\"\\n\");\n\n\t\tfor (const [lineNumber, line] of buffer.entries()) {\n\t\t\tlet result: (string | number)[];\n\t\t\trePattern.lastIndex = 0;\n\t\t\tif (!(result = rePattern.exec(line))) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\ttotalMatchingLines++;\n\t\t\tif (lineNumber > 0) {\n\t\t\t\tlines.push(`${lineNumber}: ${kleur.grey(buffer[lineNumber - 1])}`);\n\t\t\t}\n\t\t\tlines.push(\n\t\t\t\t`${lineNumber + 1}: ${kleur.grey(\n\t\t\t\t\tline.replace(rePattern, kleur.black().bgYellow(result[0])),\n\t\t\t\t)}`,\n\t\t\t\t`${lineNumber + 2}: ${kleur.grey(buffer[lineNumber + 1])}`,\n\t\t\t\t\"\",\n\t\t\t);\n\t\t}\n\t\treturn {\n\t\t\tresults: lines.length > 0 ? lines : [],\n\t\t\ttotalMatchingLines,\n\t\t};\n\t} catch (error) {\n\t\t/* istanbul ignore next */\n\t\tlogger.error(error);\n\t}\n};\n"],"names":["run","Logger","fs","kleur","prettyMilliseconds","BYTE_CHUNKS","DECIMAL","LAST_THREE_ENTRIES","MODE_GROUP_POS","MODE_OWNER_POS","MODE_WORD_POS","OCTAL","STR_TYPE_DIRECTORY","STR_TYPE_FILE","STR_TYPE_BOTH","PERMISSIONS_PREFIX","ownerNames","MONTHS","logger","boring","process","env","NODE_ENV","extractMode","mode","modeDec","Number","parseInt","toString","slice","modeOwner","charAt","modeGroup","modeWorld","modes","convertSize","bytes","sizes","length","posttxt","string_","toFixed","Array","from","join","convertDate","mtime","month","getMonth","date","getDate","padStart","hours","getHours","minutes","getMinutes","getOwnerNameFromId","uid","result","stdout","formatLongListings","stat","type","mdate","owner","size","printStatistics","duration","totalDirScanned","totalDirsFound","totalFileScanned","totalFilesFound","pattern","grep","message","yellow","green","log","printBox","checkPattern","rePattern","lastIndex","exec","runCommandOnNode","node","command","runGrepOnNode","lines","totalMatchingLines","buffer","readFileSync","split","lineNumber","line","entries","push","grey","replace","black","bgYellow","results","error"],"mappings":"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"}
package/package.json CHANGED
@@ -1,15 +1,13 @@
1
1
  {
2
2
  "name": "@node-cli/search",
3
- "version": "1.0.1",
3
+ "version": "1.0.3",
4
4
  "license": "MIT",
5
5
  "author": "Arno Versini",
6
6
  "description": "Search for files in a directory",
7
7
  "type": "module",
8
8
  "types": "./dist/index.d.ts",
9
9
  "exports": "./dist/search.js",
10
- "bin": {
11
- "search": "dist/search.js"
12
- },
10
+ "bin": "dist/search.js",
13
11
  "files": [
14
12
  "dist"
15
13
  ],
@@ -26,11 +24,11 @@
26
24
  "watch": "swc --watch --out-dir dist src"
27
25
  },
28
26
  "dependencies": {
29
- "@node-cli/logger": ">=1.0.0",
30
- "@node-cli/parser": ">=2.0.0",
31
- "@node-cli/perf": ">=1.0.0",
32
- "@node-cli/run": ">=1.0.0",
33
- "fs-extra": "11.1.1",
27
+ "@node-cli/logger": ">=1.2.0",
28
+ "@node-cli/parser": ">=2.2.1",
29
+ "@node-cli/perf": ">=1.0.2",
30
+ "@node-cli/run": ">=1.0.1",
31
+ "fs-extra": "11.2.0",
34
32
  "kleur": "4.1.5",
35
33
  "plur": "5.1.0",
36
34
  "pretty-ms": "8.0.0"
@@ -38,5 +36,5 @@
38
36
  "publishConfig": {
39
37
  "access": "public"
40
38
  },
41
- "gitHead": "fd3f9b10e925e7a7803c4eb982f25709a140096d"
39
+ "gitHead": "14e79a79e03610f47ab1269076315f183d8a3a0e"
42
40
  }