@khatastroffik/treefolder 1.2.0 → 1.3.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.
Files changed (3) hide show
  1. package/README.md +6 -0
  2. package/dist/index.js +39 -1
  3. package/package.json +62 -7
package/README.md CHANGED
@@ -38,9 +38,11 @@ This is the recommanded and easiest approach.
38
38
  1. [Auto "root folder"](#auto-root-folder)
39
39
  1. [Auto "ignore paths"](#auto-ignore-paths)
40
40
  1. [Sort leaves "folders first"](#sort-leaves-folders-first)
41
+ 1. [List output](#list-output)
41
42
  1. [Styled output](#styled-output)
42
43
  1. [Version information](#version-information)
43
44
  1. [Verbose output](#verbose-output)
45
+ 1. [Debug Output](#debug-output)
44
46
 
45
47
  ### Auto "root folder"
46
48
 
@@ -89,6 +91,10 @@ Use the command line argument `--version` or `-v` to display the version informa
89
91
 
90
92
  When the flag i.e. command line argument `--verbose` is defined/set, then a few more information will be displayed together with the tree representation.
91
93
 
94
+ ### Debug output
95
+
96
+ Use the flag `--debug` (short `-d`) to display additional information about the used tool configuration.
97
+
92
98
  ## Development
93
99
 
94
100
  ### Manually install as a globally available CLI tool `tfold`
package/dist/index.js CHANGED
@@ -1,2 +1,40 @@
1
1
  #! /usr/bin/env node
2
- "use strict";var __createBinding=this&&this.__createBinding||(Object.create?function(e,o,t,n){void 0===n&&(n=t);var r=Object.getOwnPropertyDescriptor(o,t);r&&!("get"in r?!o.__esModule:r.writable||r.configurable)||(r={enumerable:!0,get:function(){return o[t]}}),Object.defineProperty(e,n,r)}:function(e,o,t,n){void 0===n&&(n=t),e[n]=o[t]}),__setModuleDefault=this&&this.__setModuleDefault||(Object.create?function(e,o){Object.defineProperty(e,"default",{enumerable:!0,value:o})}:function(e,o){e.default=o}),__importStar=this&&this.__importStar||function(){var e=function(o){return e=Object.getOwnPropertyNames||function(e){var o=[];for(var t in e)Object.prototype.hasOwnProperty.call(e,t)&&(o[o.length]=t);return o},e(o)};return function(o){if(o&&o.__esModule)return o;var t={};if(null!=o)for(var n=e(o),r=0;r<n.length;r++)"default"!==n[r]&&__createBinding(t,o,n[r]);return __setModuleDefault(t,o),t}}(),__importDefault=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(exports,"__esModule",{value:!0});const node_fs_1=__importDefault(require("node:fs")),node_path_1=__importDefault(require("node:path")),node_process_1=require("node:process"),node_util_1=__importStar(require("node:util")),package_json_1=require("../package.json"),readdirPromise=node_util_1.default.promisify(node_fs_1.default.readdir),space=" ";var Style;!function(e){e.none="none",e.wireframe="wireframe",e.black="black",e.colored="colored"}(Style||(Style={}));const symbolStyles={none:{closed:"",open:"",file:""},wireframe:{closed:"🗀 ",open:"🗁 ",file:"🗋"},black:{closed:"🖿 ",open:"🖿 ",file:"🗎"},colored:{closed:"📁 ",open:"📂 ",file:"📄"}},parseArgsOptionsConfig={style:{type:"string",default:"none",short:"s"},verbose:{type:"boolean",default:!1},unsorted:{type:"boolean",default:!1,short:"u"},version:{type:"boolean",default:!1,short:"v"},list:{type:"boolean",default:!1,short:"l"}},config={style:Style.none,symbols:symbolStyles.none,root:".",ignores:["node_modules","dist","build",".git",".husky\\_","logs",".angular","coverage"],verbose:!1,unsorted:!1,formatAsList:!1};let folderCount=0,fileCount=0,ignoredCount=0,cliArgs={};function formatFolderLeaf(e,o,t,n){return`${e+o+t+node_path_1.default.basename(n)}\n`}function formatFileLeaf(e,o,t,n){return`${e+o+t+n.name}\n`}function formatFolderListItem(e,o,t,n){let r=n+node_path_1.default.sep;return config.style===Style.colored&&(r=(0,node_util_1.styleText)("blueBright",r)),`${r}\n`}function formatFileListItem(e,o,t,n){return`${node_path_1.default.join(n.parentPath,n.name)}\n`}let formatFolder=formatFolderLeaf,formatFile=formatFileLeaf;function colorText(e){return(0,node_util_1.styleText)("number"==typeof e?"yellow":"blueBright",`${e}`)}async function getLatestVersion(){const e=await fetch("https://registry.npmjs.org/@khatastroffik/treefolder");await new Promise(e=>setTimeout(e,100));return(await e.json())["dist-tags"].latest}function compareFolderContentItems(e,o){return e.isDirectory()?o.isFile()?-1:e.name.localeCompare(o.name):o.isDirectory()?1:e.name.localeCompare(o.name)}function isIgnored(e,o){const t=config.ignores.includes(node_path_1.default.join(e,o));return t&&ignoredCount++,t}async function getFolderContent(e){const o=(await readdirPromise(e,{withFileTypes:!0})).filter(o=>!isIgnored(e,o.name));return config.unsorted?o:o.sort(compareFolderContentItems)}async function buildTree(e,o,t,n){const r=await getFolderContent(e),i=r.length<1?config.symbols.closed:config.symbols.open,s=t?"":(n?"└─":"├─")+(config.symbols.open?"":" ");let l=formatFolder(o,s,i,e);const a=t?"":n?" ":"│ ",f=r.length-1;for(let t=0;t<r.length;t++){const n=r[t];if(n.isDirectory()&&(l+=await buildTree(node_path_1.default.join(e,n.name),o+a,!1,t===f)),n.isFile()){fileCount++;const e=t===f?`└─${config.symbols.file} `:`├─${config.symbols.file} `;l+=formatFile(o,a,e,n)}}return folderCount++,l}async function configure(){let e;try{e=(0,node_util_1.parseArgs)({options:parseArgsOptionsConfig,allowPositionals:!0,strict:!0})}catch(e){const o=e;return console.error(`[${(0,node_util_1.styleText)("red",o.name)}]: ${o.message}`),(0,node_process_1.exit)(1)}const{values:o,positionals:t}=e;if(o.version)return await version(),(0,node_process_1.exit)(0);config.formatAsList=Boolean(o.list),config.formatAsList&&(formatFolder=formatFolderListItem,formatFile=formatFileListItem),config.style=Style[o.style]??config.style,config.symbols=symbolStyles[config.style],config.root=node_path_1.default.resolve(t.length>0?t[0]:config.root),config.ignores=config.ignores.map(e=>node_path_1.default.join(config.root,e)),config.unsorted=Boolean(o.unsorted),config.verbose=Boolean(o.verbose),cliArgs={...o,root:t[0]??"n/a"}}async function version(){let e;const o=await getLatestVersion();o&&o!==package_json_1.version&&(e=(0,node_util_1.styleText)("yellow",`\n┌─────────────────────────────────────────────────────┐\n| A new version of Treefolder is available: |\n| current: ${package_json_1.version} -> latest: ${o} |\n| |\n| Install the latest version with: |\n| "npm update -g @khatastroffik/treefolder@latest" |\n└─────────────────────────────────────────────────────┘\n`)),console.info(colorText(`\n Treefolder aka "tfold"\n Version ${package_json_1.version}\n \n https://npmjs.com/@khatastroffik/treefolder\n${e??'\n ┌─────────────────────────────────────────────┐\n | |\n ╭━┳━╭━╭━╮╮\n ┃┈┈┈┣▄╋▄┫\n ┃┈┃┈╰━╰━━━━━━╮ "K11K"\n ╰┳╯┈┈┈┈┈┈┈┈ ◢█◣ a very pragmatic dog\n ┃┈┈┈┈┈┈┈┈┈┈████\n ┃┈┈┈┈┈┈┈┈┈┈◥█◤\n ┃┈┈┈┈╭━┳━━━━╯\n ┣━━━━━━┫\n | |\n └──────────── made by khatastroffik ──────────┘\n '}`))}async function verbose(){config.verbose&&(console.info(colorText("\nCommand line arguments:")),console.info(cliArgs),console.info(colorText("\nTreefolder configuration:")),console.info(config,"\n"),console.info(colorText(`Scanned ${colorText(folderCount)} folders and ${colorText(fileCount)} files.`)),console.info(colorText(`Filtered out ${colorText(ignoredCount)} items (folders or files).`)))}async function main(){await configure();const e=await buildTree(config.root,"",!0,!0);console.info(e),await verbose()}main();
2
+ "use strict";var S=Object.create;var $=Object.defineProperty;var M=Object.getOwnPropertyDescriptor;var O=Object.getOwnPropertyNames;var K=Object.getPrototypeOf,R=Object.prototype.hasOwnProperty;var _=(e,t,n,l)=>{if(t&&typeof t=="object"||typeof t=="function")for(let i of O(t))!R.call(e,i)&&i!==n&&$(e,i,{get:()=>t[i],enumerable:!(l=M(t,i))||l.enumerable});return e};var u=(e,t,n)=>(n=e!=null?S(K(e)):{},_(t||!e||!e.__esModule?$(n,"default",{value:e,enumerable:!0}):n,e));var h=u(require("node:path"));var r=class{static folderCount=1;static fileCount=0;static ignoredCount=0;static commandLineArgs={}};var b=require("node:process"),f=require("node:util");var p="1.2.1";function s(e){return(0,f.styleText)(typeof e=="number"?"yellow":"blueBright",`${e}`)}async function G(){let e=await fetch("https://registry.npmjs.org/@khatastroffik/treefolder");return await new Promise(l=>setTimeout(l,100)),(await e.json())["dist-tags"].latest}async function C(){if(o.version){let e=`
3
+ \u250C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510
4
+ | |
5
+ \u256D\u2501\u2533\u2501\u256D\u2501\u256D\u2501\u256E\u256E
6
+ \u2503\u2508\u2508\u2508\u2523\u2584\u254B\u2584\u252B
7
+ \u2503\u2508\u2503\u2508\u2570\u2501\u2570\u2501\u2501\u2501\u2501\u2501\u2501\u256E "K11K"
8
+ \u2570\u2533\u256F\u2508\u2508\u2508\u2508\u2508\u2508\u2508\u2508 \u25E2\u2588\u25E3 a very pragmatic dog
9
+ \u2503\u2508\u2508\u2508\u2508\u2508\u2508\u2508\u2508\u2508\u2508\u2588\u2588\u2588\u2588
10
+ \u2503\u2508\u2508\u2508\u2508\u2508\u2508\u2508\u2508\u2508\u2508\u25E5\u2588\u25E4
11
+ \u2503\u2508\u2508\u2508\u2508\u256D\u2501\u2533\u2501\u2501\u2501\u2501\u256F
12
+ \u2523\u2501\u2501\u2501\u2501\u2501\u2501\u252B
13
+ | |
14
+ \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 made by khatastroffik \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518
15
+ `,t,n=await G();return n&&n!==p&&(t=(0,f.styleText)("yellow",`
16
+ \u250C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510
17
+ | A new version of Treefolder is available: |
18
+ | current: ${p} -> latest: ${n} |
19
+ | |
20
+ | Install the latest version with: |
21
+ | "npm update -g @khatastroffik/treefolder@latest" |
22
+ \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518
23
+ `)),console.info(s(`
24
+ Treefolder aka "tfold"
25
+ Version ${p}
26
+
27
+ https://npmjs.com/@khatastroffik/treefolder
28
+ ${t??e}`)),(0,b.exit)(0)}}async function P(){o.debug&&(console.info(s(`${"+".repeat(26)} DEBUG ${"+".repeat(27)}`)),console.info(s("Command line arguments:")),console.info(r.commandLineArgs),console.info(s("Treefolder configuration:")),console.info(o),console.info(s("FolderCount:"),s(r.folderCount)),console.info(s("FileCount:"),s(r.fileCount)),console.info(s("IgnoredCount:"),s(r.ignoredCount)),console.info(s("+".repeat(60))))}async function j(){o.verbose&&(console.info(s(`
29
+ Scanned ${s(r.folderCount)} folders and ${s(r.fileCount)} files.`)),console.info(s(`Filtered out ${s(r.ignoredCount)} items (folders or files).`)))}var U={style:{type:"string",default:"none",short:"s"},verbose:{type:"boolean",default:!1},unsorted:{type:"boolean",default:!1,short:"u"},version:{type:"boolean",default:!1,short:"v"},list:{type:"boolean",default:!1,short:"l"},debug:{type:"boolean",default:!1,short:"d"}};function I(){try{return(0,f.parseArgs)({options:U,allowPositionals:!0,strict:!0})}catch(e){let t=e;return console.error(`[${(0,f.styleText)("red",t.name)}]: ${t.message}`),(0,b.exit)(1)}}var a=" ",x=(i=>(i.none="none",i.wireframe="wireframe",i.black="black",i.colored="colored",i))(x||{}),T={none:{closed:"",open:"",file:""},wireframe:{closed:"\u{1F5C0} ",open:"\u{1F5C1} ",file:"\u{1F5CB}"},black:{closed:"\u{1F5BF} ",open:"\u{1F5BF} ",file:"\u{1F5CE}"},colored:{closed:"\u{1F4C1} ",open:"\u{1F4C2} ",file:"\u{1F4C4}"}},o={style:"none",symbols:T.none,root:".",ignores:["node_modules","dist","build",".git",".husky\\_","logs",".angular","coverage"],verbose:!1,unsorted:!1,formatAsList:!1,version:!1,debug:!1};async function D(){let{values:e,positionals:t}=I();o.version=e.version,o.formatAsList=e.list,o.style=x[e.style]??o.style,o.symbols=T[o.style],o.root=h.default.resolve(t[0]??o.root),o.ignores=o.ignores.map(n=>h.default.join(o.root,n)),o.unsorted=e.unsorted,o.verbose=e.verbose,o.debug=e.debug,r.commandLineArgs={...e,root:t[0]??"n/a"}}var L=u(require("node:fs")),c=u(require("node:path")),g=u(require("node:util"));var W=g.default.promisify(L.default.readdir),w,k;function q(e){return`${e.indent+e.folderPrefix+e.foldersymbol+c.default.basename(e.folderName)}
30
+ `}function J(e){return`${e.indent+e.contentItemPrefix+e.entityPrefix+e.contentItem.name}
31
+ `}function Q(e){let t=e.folderName+c.default.sep;return o.style==="colored"&&(t=(0,g.styleText)("blueBright",t)),`${t}
32
+ `}function X(e){return`${c.default.join(e.contentItem.parentPath,e.contentItem.name)}
33
+ `}function Y(e,t){return e.isDirectory()?t.isFile()?-1:e.name.localeCompare(t.name):t.isDirectory()?1:e.name.localeCompare(t.name)}function Z(e,t){let n=o.ignores.includes(c.default.join(e,t));return n&&r.ignoredCount++,n}async function H(e){let t=(await W(e,{withFileTypes:!0})).filter(n=>!Z(e,n.name));return o.unsorted?t:t.sort(Y)}async function A(e,t,n,l){let i=await H(e),N=i.length<1?o.symbols.closed:o.symbols.open,B=n?"":(l?"\u2514\u2500":"\u251C\u2500")+(o.symbols.open?"":a),y=w({indent:t,folderPrefix:B,foldersymbol:N,folderName:e}),v=n?"":l?`${a}${a}${a}`:`\u2502${a}${a}`,F=i.length-1;for(let d=0;d<i.length;d++){let m=i[d];if(m.isDirectory()&&(y+=await A(c.default.join(e,m.name),t+v,!1,d===F)),m.isFile()){r.fileCount++;let E=d===F?`\u2514\u2500${o.symbols.file}${a}`:`\u251C\u2500${o.symbols.file}${a}`;y+=k({indent:t,contentItemPrefix:v,entityPrefix:E,contentItem:m})}}return r.folderCount++,y}async function V(){w=q,k=J,o.formatAsList&&(w=Q,k=X);let e=await A(o.root,"",!0,!0);console.info(e)}async function ee(){await D(),await C(),await V(),await P(),await j()}ee();
34
+ /*!
35
+ * @khatastroffik/treefolder
36
+ *
37
+ * License: MIT
38
+ * Copyright (c) 2026, Loïs Bégué
39
+ *
40
+ */
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@khatastroffik/treefolder",
3
- "version": "1.2.0",
3
+ "version": "1.3.0",
4
4
  "devEngines": {
5
5
  "packageManager": [
6
6
  {
@@ -55,6 +55,7 @@
55
55
  "@eslint/markdown": "^7.5.1",
56
56
  "@types/jest": "^30.0.0",
57
57
  "@types/node": "^25.0.3",
58
+ "esbuild": "^0.27.2",
58
59
  "eslint": "^9.39.2",
59
60
  "eslint-plugin-format": "^1.1.0",
60
61
  "eslint-plugin-jest": "^29.12.1",
@@ -63,7 +64,6 @@
63
64
  "jest": "^30.2.0",
64
65
  "lint-staged": "^16.2.7",
65
66
  "rimraf": "^6.1.2",
66
- "terser": "^5.46.0",
67
67
  "ts-jest": "^29.4.6",
68
68
  "tsx": "^4.21.0",
69
69
  "typescript": "^5.9.3",
@@ -72,21 +72,76 @@
72
72
  "lint-staged": {
73
73
  "*.ts": "pnpm lintix"
74
74
  },
75
+ "commit-and-tag-version": {
76
+ "types": [
77
+ {
78
+ "type": "feat",
79
+ "section": "Features",
80
+ "hidden": false
81
+ },
82
+ {
83
+ "type": "chore",
84
+ "section": "Chore",
85
+ "hidden": false
86
+ },
87
+ {
88
+ "type": "ci",
89
+ "section": "CI/CD",
90
+ "hidden": false
91
+ },
92
+ {
93
+ "type": "improve",
94
+ "section": "Improvements / Addendum",
95
+ "hidden": false
96
+ },
97
+ {
98
+ "type": "fix",
99
+ "section": "Bug Fixes / Corrigendum",
100
+ "hidden": false
101
+ },
102
+ {
103
+ "type": "perf",
104
+ "section": "Performance / Optimization",
105
+ "hidden": false
106
+ },
107
+ {
108
+ "type": "test",
109
+ "section": "Code Quality",
110
+ "hidden": false
111
+ },
112
+ {
113
+ "type": "refactor",
114
+ "section": "Refactors",
115
+ "hidden": false
116
+ },
117
+ {
118
+ "type": "docs",
119
+ "section": "Documentation",
120
+ "hidden": false
121
+ },
122
+ {
123
+ "type": "build",
124
+ "section": "Build System / Dependencies",
125
+ "hidden": false
126
+ }
127
+ ]
128
+ },
75
129
  "scripts": {
76
130
  "test": "jest --passWithNoTests",
77
131
  "lint": "eslint .",
78
132
  "lintix": "eslint . --fix",
79
133
  "clean": "rimraf ./dist",
80
- "dev": "tsx watch src/index.ts",
134
+ "dev": "tsx watch --include \"src/**/*\" src/index.ts",
81
135
  "typecheck": "tsc --noEmit",
82
- "build": "pnpm clean && tsc",
83
- "build2prod": "pnpm build && terser dist/index.js -o dist/index.js -c -m",
136
+ "build": "pnpm clean && esbuild --bundle --minify --platform=node --outdir=dist ./src/index.ts",
137
+ "buildwatch": "pnpm build --watch --watch-delay=500",
138
+ "build2prod": "pnpm build --tree-shaking=true --analyze",
84
139
  "start": "node .",
85
140
  "pushtags": "git push --follow-tags origin main",
86
141
  "try-commit": "git hook run pre-commit",
87
142
  "tsx": "tsx",
88
- "release": "pnpm dlx commit-and-tag-version",
89
- "release:test": "pnpm dlx commit-and-tag-version --dry-run",
143
+ "release": "pnpx commit-and-tag-version",
144
+ "release:test": "pnpx commit-and-tag-version --dry-run",
90
145
  "pub": "pnpm pushtags && pnpm publish",
91
146
  "pub:test": "pnpm publish --dry-run --force --no-git-checks"
92
147
  }