make-folder-txt 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.
- package/README.md +20 -0
- package/bin/make-folder-txt.js +35 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -59,6 +59,25 @@ make-folder-txt --ignore-folder examples extensions docs --ignore-file LICENSE
|
|
|
59
59
|
make-folder-txt --ignore-file .env .env.local secrets.txt
|
|
60
60
|
```
|
|
61
61
|
|
|
62
|
+
Use a `.txtignore` file (works like `.gitignore`):
|
|
63
|
+
|
|
64
|
+
```bash
|
|
65
|
+
# Create a .txtignore file in your project root
|
|
66
|
+
echo "node_modules/" > .txtignore
|
|
67
|
+
echo "*.log" >> .txtignore
|
|
68
|
+
echo ".env" >> .txtignore
|
|
69
|
+
echo "coverage/" >> .txtignore
|
|
70
|
+
|
|
71
|
+
# The tool will automatically read and respect .txtignore patterns
|
|
72
|
+
make-folder-txt
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
The `.txtignore` file supports:
|
|
76
|
+
- File and folder names (one per line)
|
|
77
|
+
- Wildcard patterns (`*.log`, `temp-*`)
|
|
78
|
+
- Comments (lines starting with `#`)
|
|
79
|
+
- Folder patterns with trailing slash (`docs/`)
|
|
80
|
+
|
|
62
81
|
Include only specific folders/files by name (everything else is ignored):
|
|
63
82
|
|
|
64
83
|
```bash
|
|
@@ -155,6 +174,7 @@ The tool is smart about what it ignores so your output stays clean and readable.
|
|
|
155
174
|
| 📏 Large files | Any file over **500 KB** |
|
|
156
175
|
| 🗑️ System files | `.DS_Store`, `Thumbs.db`, `desktop.ini` |
|
|
157
176
|
| 📄 Output file | The generated `foldername.txt` file (to avoid infinite loops) |
|
|
177
|
+
| 📝 .txtignore | Any files/folders specified in `.txtignore` file |
|
|
158
178
|
|
|
159
179
|
Binary and skipped files are noted in the output as `[binary / skipped]` so you always know what was omitted.
|
|
160
180
|
|
package/bin/make-folder-txt.js
CHANGED
|
@@ -19,6 +19,24 @@ const BINARY_EXTS = new Set([
|
|
|
19
19
|
|
|
20
20
|
// ── helpers ───────────────────────────────────────────────────────────────────
|
|
21
21
|
|
|
22
|
+
function readTxtIgnore(rootDir) {
|
|
23
|
+
const txtIgnorePath = path.join(rootDir, '.txtignore');
|
|
24
|
+
const ignorePatterns = new Set();
|
|
25
|
+
|
|
26
|
+
try {
|
|
27
|
+
const content = fs.readFileSync(txtIgnorePath, 'utf8');
|
|
28
|
+
const lines = content.split('\n')
|
|
29
|
+
.map(line => line.trim())
|
|
30
|
+
.filter(line => line && !line.startsWith('#'));
|
|
31
|
+
|
|
32
|
+
lines.forEach(line => ignorePatterns.add(line));
|
|
33
|
+
} catch (err) {
|
|
34
|
+
// .txtignore doesn't exist or can't be read - that's fine
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
return ignorePatterns;
|
|
38
|
+
}
|
|
39
|
+
|
|
22
40
|
function collectFiles(
|
|
23
41
|
dir,
|
|
24
42
|
rootDir,
|
|
@@ -35,6 +53,7 @@ function collectFiles(
|
|
|
35
53
|
inSelectedFolder = false,
|
|
36
54
|
hasOnlyFilters = false,
|
|
37
55
|
rootName = "",
|
|
56
|
+
txtIgnore = new Set(),
|
|
38
57
|
} = options;
|
|
39
58
|
|
|
40
59
|
let entries;
|
|
@@ -62,6 +81,14 @@ function collectFiles(
|
|
|
62
81
|
return;
|
|
63
82
|
}
|
|
64
83
|
|
|
84
|
+
// Check against .txtignore patterns
|
|
85
|
+
if (txtIgnore.has(entry.name) || txtIgnore.has(`${entry.name}/`)) {
|
|
86
|
+
if (!hasOnlyFilters) {
|
|
87
|
+
lines.push(`${indent}${connector}${entry.name}/ [skipped]`);
|
|
88
|
+
}
|
|
89
|
+
return;
|
|
90
|
+
}
|
|
91
|
+
|
|
65
92
|
const childPath = path.join(dir, entry.name);
|
|
66
93
|
const childInSelectedFolder = inSelectedFolder || onlyFolders.has(entry.name);
|
|
67
94
|
const childLines = [];
|
|
@@ -80,6 +107,7 @@ function collectFiles(
|
|
|
80
107
|
inSelectedFolder: childInSelectedFolder,
|
|
81
108
|
hasOnlyFilters,
|
|
82
109
|
rootName,
|
|
110
|
+
txtIgnore,
|
|
83
111
|
},
|
|
84
112
|
);
|
|
85
113
|
|
|
@@ -94,6 +122,9 @@ function collectFiles(
|
|
|
94
122
|
} else {
|
|
95
123
|
if (ignoreFiles.has(entry.name)) return;
|
|
96
124
|
|
|
125
|
+
// Check against .txtignore patterns
|
|
126
|
+
if (txtIgnore.has(entry.name)) return;
|
|
127
|
+
|
|
97
128
|
// Ignore .txt files that match the folder name (e.g., foldername.txt)
|
|
98
129
|
if (entry.name.endsWith('.txt') && entry.name === `${rootName}.txt`) return;
|
|
99
130
|
|
|
@@ -255,6 +286,9 @@ for (let i = 0; i < args.length; i += 1) {
|
|
|
255
286
|
const folderPath = process.cwd();
|
|
256
287
|
const rootName = path.basename(folderPath);
|
|
257
288
|
|
|
289
|
+
// Read .txtignore file if it exists
|
|
290
|
+
const txtIgnore = readTxtIgnore(folderPath);
|
|
291
|
+
|
|
258
292
|
const outputFile = outputArg
|
|
259
293
|
? path.resolve(outputArg)
|
|
260
294
|
: path.join(process.cwd(), `${rootName}.txt`);
|
|
@@ -269,7 +303,7 @@ const { lines: treeLines, filePaths } = collectFiles(
|
|
|
269
303
|
ignoreFiles,
|
|
270
304
|
onlyFolders,
|
|
271
305
|
onlyFiles,
|
|
272
|
-
{ hasOnlyFilters, rootName },
|
|
306
|
+
{ hasOnlyFilters, rootName, txtIgnore },
|
|
273
307
|
);
|
|
274
308
|
|
|
275
309
|
// ── build output ──────────────────────────────────────────────────────────────
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "make-folder-txt",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.3.0",
|
|
4
4
|
"description": "Generate a single .txt file containing the full folder structure and file contents of any project, ignoring node_modules and other junk.",
|
|
5
5
|
"main": "bin/make-folder-txt.js",
|
|
6
6
|
"bin": {
|