mrmlnc / fast-glob

:rocket: It's a very fast and efficient glob library for Node.js
MIT License
2.51k stars 108 forks source link

`convertPathToPattern` not converting `some\\@directory\\` correctly #452

Open AriPerkkio opened 1 month ago

AriPerkkio commented 1 month ago

Environment

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

  1. npm init
  2. npm i -D fast-glob @vitest/coverage-v8
  3. Save code sample to index.js
  4. 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("\\@", "/@")),
});

image

AriPerkkio commented 1 month ago

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?