Skip to content

Commit 863f82a

Browse files
committed
fix(core): normalise windows backslashes
Closes #126
1 parent 4a06c2c commit 863f82a

3 files changed

Lines changed: 54 additions & 12 deletions

File tree

src/main.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,8 @@ mod instance_state;
3131
mod logger;
3232
mod package_json;
3333
mod packages;
34+
#[cfg(test)]
35+
mod packages_test;
3436
mod rcfile;
3537
#[cfg(test)]
3638
mod rcfile_test;

src/packages.rs

Lines changed: 19 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -156,6 +156,24 @@ impl Packages {
156156
}
157157
}
158158

159+
/// Normalize a source pattern by:
160+
/// 1. Converting Windows backslashes to forward slashes for glob compatibility
161+
/// 2. Ensuring pattern ends with /package.json
162+
///
163+
/// Examples:
164+
/// - "projects\\apps\\*" -> "projects/apps/*/package.json"
165+
/// - "projects/libs/*" -> "projects/libs/*/package.json"
166+
/// - "package.json" -> "package.json"
167+
/// - "apps\\*/package.json" -> "apps/*/package.json"
168+
pub fn normalize_pattern(pattern: String) -> String {
169+
let normalized = pattern.replace('\\', "/");
170+
if normalized.contains("package.json") {
171+
normalized
172+
} else {
173+
format!("{normalized}/package.json")
174+
}
175+
}
176+
159177
/// Resolve every source glob pattern into their absolute file paths of
160178
/// package.json files
161179
fn get_file_paths(config: &Config) -> Vec<PathBuf> {
@@ -214,18 +232,7 @@ fn get_source_patterns(config: &Config) -> Vec<String> {
214232
patterns
215233
})
216234
})
217-
.map(|patterns| {
218-
patterns
219-
.into_iter()
220-
.map(|pattern| {
221-
if pattern.contains("package.json") {
222-
pattern
223-
} else {
224-
format!("{pattern}/package.json")
225-
}
226-
})
227-
.collect()
228-
})
235+
.map(|patterns| patterns.into_iter().map(normalize_pattern).collect())
229236
.or_else(get_default_patterns)
230237
.unwrap()
231238
}

src/packages_test.rs

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
use crate::packages::normalize_pattern;
2+
3+
#[test]
4+
fn normalizes_backslashes_to_forward_slashes() {
5+
let cases = vec![
6+
// Windows-style backslashes
7+
("projects\\apps\\*", "projects/apps/*/package.json"),
8+
("projects\\libs\\lib1", "projects/libs/lib1/package.json"),
9+
("apps\\*\\src", "apps/*/src/package.json"),
10+
// Mixed slashes
11+
("projects\\mixed/pkg1", "projects/mixed/pkg1/package.json"),
12+
("apps/test\\utils", "apps/test/utils/package.json"),
13+
// Already normalized (forward slashes)
14+
("projects/apps/*", "projects/apps/*/package.json"),
15+
("packages/*", "packages/*/package.json"),
16+
// Already includes package.json with backslashes
17+
("apps\\*/package.json", "apps/*/package.json"),
18+
("projects\\libs\\*\\package.json", "projects/libs/*/package.json"),
19+
// Already includes package.json with forward slashes
20+
("apps/*/package.json", "apps/*/package.json"),
21+
("packages/*/package.json", "packages/*/package.json"),
22+
// Just package.json
23+
("package.json", "package.json"),
24+
// Complex patterns
25+
("**\\*\\package.json", "**/*/package.json"),
26+
("src\\**\\tests", "src/**/tests/package.json"),
27+
];
28+
29+
for (input, expected) in cases {
30+
let result = normalize_pattern(input.to_string());
31+
assert_eq!(result, expected, "normalize_pattern({input:?}) should return {expected:?}");
32+
}
33+
}

0 commit comments

Comments
 (0)