`convertPathToPattern` not converting `some\\@directory\\` correctly
Environment
- OS Version: Windows 11
- Node.js Version: 20.15.0
Works fine on non-Windows, e.g. Mac. convertPathToPattern checks OS so reproduces only on Windows.
Actual behavior
const resolved = path.join(require.resolve("@vitest/coverage-v8"), "..");
const pattern = fg.convertPathToPattern(resolved) + "/**";
const files = fg.globSync(pattern);
// resolved: 'C:\\Users\\Ari\\git\\fastglob\\node_modules\\@vitest\\coverage-v8\\dist',
// pattern: 'C:/Users/Ari/git/fastglob/node_modules\\@vitest/coverage-v8/dist/**',
// ^^^
// files: []
Expected behavior
// resolved: 'C:\\Users\\Ari\\git\\fastglob\\node_modules\\@vitest\\coverage-v8\\dist',
// pattern: 'C:/Users/Ari/git/fastglob/node_modules/@vitest/coverage-v8/dist/**',
// ^^
// files: [
// 'C:/Users/Ari/git/fastglob/node_modules/@vitest/coverage-v8/dist/index.d.ts',
// 'C:/Users/Ari/git/fastglob/node_modules/@vitest/coverage-v8/dist/index.js',
// 'C:/Users/Ari/git/fastglob/node_modules/@vitest/coverage-v8/dist/provider.d.ts',
// 'C:/Users/Ari/git/fastglob/node_modules/@vitest/coverage-v8/dist/provider.js'
// ]
Steps to reproduce
-
npm init -
npm i -D fast-glob @vitest/coverage-v8 - Save code sample to
index.js -
node index.js
Code sample
const path = require("node:path");
const fg = require("fast-glob");
const resolved = path.join(require.resolve("@vitest/coverage-v8"), "..");
const pattern = fg.convertPathToPattern(resolved) + "/**";
const files = fg.globSync(pattern);
console.log({
resolved,
pattern,
files,
fixedPattern: pattern.replaceAll("\\@", "/@"),
fixed: fg.globSync(pattern.replaceAll("\\@", "/@")),
});
I see that https://github.com/mrmlnc/fast-glob?tab=readme-ov-file#convertpathtopatternpath does mention @ and backslash using as espace characters. In this case \\@ is not escape for @, right? In \@ it would be?
The problem here is that \\@ is considered an already escaped special character. Otherwise, double character escaping will be applied here.
The goal of this task is to learn how to differentiate between a path separator and a special character, when the special character follows the path separator in the path.
it.only('should convert slashes after the path separator', () => {
assert.strictEqual(util.convertWindowsPathToPattern('\\@'), '/@');
assert.strictEqual(util.convertWindowsPathToPattern('\\\\@'), '/\\@');
});
And… I'm not sure there is a way to solve this problem.