forked from prettier/prettier
-
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathpatterns-dirs.js
108 lines (90 loc) · 4.12 KB
/
patterns-dirs.js
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
96
97
98
99
100
101
102
103
104
105
106
107
108
"use strict";
const path = require("path");
const fs = require("fs");
const runPrettier = require("../runPrettier");
expect.addSnapshotSerializer(require("../path-serializer"));
// ESLint-like behavior
// https://github.com/prettier/prettier/pull/6639#issuecomment-548949954
//
// 1. `prettier dir1 dir2` – prettify all files with supported extensions inside `dir1` and `dir2`.
//
// 2. `prettier dir1 "dir2/**/*"` – prettify all files with supported extensions inside `dir1`
// as well as all files matched by the `dir2/**/*` glob.
// If any of the latter files have unknown extensions – log an error for them. (*)
//
// 3. `prettier non-exists-dir "dir2/**/*""` – log an error that `non-exists-dir` resulted in 0 files
// and prettify all files matched by the `dir2/**/*` glob.
// If any of the latter files have unknown extensions – log an error for them. (*)
// (Note: ESLint just prints an error and doesn't process anything.)
//
// 4. `prettier . "dir2/**/*"` – prettify all files with supported extensions in `.`
// and all files matched by the `dir2/**/*` glob.
// If any of the latter files have unknown extensions – log an error for them. (*)
//
// (*) That error ("No parser could be inferred for file") doesn't affect the error code.
testPatterns("1", ["dir1", "dir2"]);
testPatterns("1a - with *.foo plugin", [
"dir1",
"dir2",
"--plugin=../../plugins/extensions/plugin",
]);
testPatterns("1b - special characters in dir name", ["dir1", "!dir"], {
stdout: expect.stringMatching(/!dir[/\\]a\.js/),
});
testPatterns("1c", ["dir1", "empty"], { status: 2 });
testPatterns("2", ["dir1", "dir2/**/*"], { status: 1 });
testPatterns("3", ["nonexistent-dir", "dir2/**/*"], { status: 2 });
testPatterns("4", [".", "dir2/**/*"], { status: 1 });
describe("Negative patterns", () => {
testPatterns("1", ["dir1", "!dir1/nested1"]);
testPatterns("1a", ["dir1", "!dir1/nested1/*"]);
testPatterns("2", [".", "!dir1/nested1"]);
testPatterns("3", [".", "!dir1/nested1/an1.js"]);
testPatterns("4", ["!nonexistent-dir1 !nonexistent-dir2"], { status: 2 });
testPatterns("with explicit files", ["dir1/a1.js", "dir2/a2.js", "!dir1/*"], {
status: 2,
});
});
testPatterns("Exclude yarn.lock when expanding directories", ["."], {
stdout: expect.not.stringContaining("yarn.lock"),
});
if (path.sep === "/") {
// Don't use snapshots in these tests as they're conditionally executed on non-Windows only.
const base = path.resolve(__dirname, "../cli/patterns-dirs");
// We can't commit these dirs without causing problems on Windows.
// TODO: these should be moved to a `beforeAll`, but for that to be possible,
// `runPrettier` should be refactored to use `describe` and `beforeEach` for doing setup.
fs.mkdirSync(path.resolve(base, "test-a\\"));
fs.writeFileSync(path.resolve(base, "test-a\\", "test.js"), "x");
fs.mkdirSync(path.resolve(base, "test-b\\?"));
fs.writeFileSync(path.resolve(base, "test-b\\?", "test.js"), "x");
describe("Backslashes in names", () => {
afterAll(() => {
fs.unlinkSync(path.resolve(base, "test-a\\", "test.js"));
fs.rmdirSync(path.resolve(base, "test-a\\"));
fs.unlinkSync(path.resolve(base, "test-b\\?", "test.js"));
fs.rmdirSync(path.resolve(base, "test-b\\?"));
});
testPatterns("", ["test-a\\/test.js"], { stdout: "test-a\\/test.js\n" });
testPatterns("", ["test-a\\"], { stdout: "test-a\\/test.js\n" });
testPatterns("", ["test-a*/*"], { stdout: "test-a\\/test.js\n" });
testPatterns("", ["test-b\\?/test.js"], { stdout: "test-b\\?/test.js\n" });
testPatterns("", ["test-b\\?"], { stdout: "test-b\\?/test.js\n" });
testPatterns("", ["test-b*/*"], { stdout: "test-b\\?/test.js\n" });
});
}
function testPatterns(namePrefix, cliArgs, expected = {}) {
const testName =
(namePrefix ? namePrefix + ": " : "") +
"prettier " +
cliArgs
.map((arg) => (/^[\w./=-]+$/.test(arg) ? arg : `'${arg}'`))
.join(" ");
describe(testName, () => {
runPrettier("cli/patterns-dirs", [...cliArgs, "-l"]).test({
write: [],
...(!("status" in expected) && { stderr: "", status: 1 }),
...expected,
});
});
}