-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathgitignore.test.ts
More file actions
95 lines (80 loc) · 3.53 KB
/
Copy pathgitignore.test.ts
File metadata and controls
95 lines (80 loc) · 3.53 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
import { existsSync, mkdirSync, mkdtempSync, readFileSync, rmSync, writeFileSync } from "node:fs"
import { tmpdir } from "node:os"
import { join } from "node:path"
import { afterEach, describe, expect, it } from "vitest"
import { compressFolder, decompressToPath } from "../src/index.js"
const tempDirs: string[] = []
afterEach(() => {
for (const dir of tempDirs.splice(0)) {
rmSync(dir, { recursive: true, force: true })
}
})
function makeTempDir(): string {
const dir = mkdtempSync(join(tmpdir(), "text-compress-gitignore-"))
tempDirs.push(dir)
return dir
}
describe("gitignore filtering", () => {
it("excludes files matching the root .gitignore", () => {
const src = makeTempDir()
writeFileSync(join(src, ".gitignore"), "node_modules/\n*.log\n")
writeFileSync(join(src, "keep.txt"), "keep")
writeFileSync(join(src, "debug.log"), "drop")
mkdirSync(join(src, "node_modules"))
writeFileSync(join(src, "node_modules", "pkg.js"), "drop")
const { encoded } = compressFolder(src, 64)
const dest = makeTempDir()
const stats = decompressToPath(encoded, dest, 64)
expect(stats.files).toBe(2)
expect(readFileSync(join(dest, "keep.txt"), "utf-8")).toBe("keep")
expect(existsSync(join(dest, ".gitignore"))).toBe(true)
expect(existsSync(join(dest, "debug.log"))).toBe(false)
expect(existsSync(join(dest, "node_modules"))).toBe(false)
})
it("applies nested .gitignore rules from outside into inside", () => {
const src = makeTempDir()
writeFileSync(join(src, ".gitignore"), "build/\n")
mkdirSync(join(src, "src"))
writeFileSync(join(src, "src", ".gitignore"), "*.tmp\n!important.o\n")
writeFileSync(join(src, "src", "main.ts"), "code")
writeFileSync(join(src, "src", "scratch.tmp"), "drop")
writeFileSync(join(src, "src", "important.o"), "keep")
mkdirSync(join(src, "build"))
writeFileSync(join(src, "build", "out.js"), "drop")
const { encoded } = compressFolder(src, 64)
const dest = makeTempDir()
const stats = decompressToPath(encoded, dest, 64)
expect(stats.files).toBe(4)
expect(readFileSync(join(dest, "src", "main.ts"), "utf-8")).toBe("code")
expect(readFileSync(join(dest, "src", "important.o"), "utf-8")).toBe("keep")
expect(existsSync(join(dest, "src", "scratch.tmp"))).toBe(false)
expect(existsSync(join(dest, "build"))).toBe(false)
})
it("applies parent repo .gitignore when compressing a subdirectory", () => {
const repo = makeTempDir()
mkdirSync(join(repo, ".git"))
writeFileSync(join(repo, ".gitignore"), "dist/\n")
mkdirSync(join(repo, "pkg"))
writeFileSync(join(repo, "pkg", "index.ts"), "code")
mkdirSync(join(repo, "dist"))
writeFileSync(join(repo, "dist", "bundle.js"), "drop")
const { encoded } = compressFolder(join(repo, "pkg"), 64)
const dest = makeTempDir()
const stats = decompressToPath(encoded, dest, 64)
expect(stats.files).toBe(1)
expect(readFileSync(join(dest, "index.ts"), "utf-8")).toBe("code")
})
it("prunes ignored directories without emitting them", () => {
const src = makeTempDir()
writeFileSync(join(src, ".gitignore"), "ignored/\n")
writeFileSync(join(src, "visible.txt"), "yes")
mkdirSync(join(src, "ignored"))
writeFileSync(join(src, "ignored", "hidden.txt"), "no")
const { encoded, dirCount } = compressFolder(src, 64)
expect(dirCount).toBe(0)
const dest = makeTempDir()
decompressToPath(encoded, dest, 64)
expect(existsSync(join(dest, "visible.txt"))).toBe(true)
expect(existsSync(join(dest, "ignored"))).toBe(false)
})
})