From cc2a64629530daa553fdafc25ecdba2825e4ddfc Mon Sep 17 00:00:00 2001 From: Thijs Louisse Date: Wed, 6 Nov 2024 11:48:51 +0100 Subject: [PATCH] fix(providence-analytics): optimisedGlob allows cwd with trailing slash --- .changeset/happy-bears-rescue.md | 5 +++ .../src/program/utils/optimised-glob.js | 15 ++++++- .../program/utils/optimised-glob.test.js | 40 +++++++++++++++++++ 3 files changed, 58 insertions(+), 2 deletions(-) create mode 100644 .changeset/happy-bears-rescue.md diff --git a/.changeset/happy-bears-rescue.md b/.changeset/happy-bears-rescue.md new file mode 100644 index 000000000..6c66dc2be --- /dev/null +++ b/.changeset/happy-bears-rescue.md @@ -0,0 +1,5 @@ +--- +'providence-analytics': patch +--- + +optimisedGlob: allow providing cwd with trailing slash diff --git a/packages-node/providence-analytics/src/program/utils/optimised-glob.js b/packages-node/providence-analytics/src/program/utils/optimised-glob.js index 2e49a9509..bb0d34931 100644 --- a/packages-node/providence-analytics/src/program/utils/optimised-glob.js +++ b/packages-node/providence-analytics/src/program/utils/optimised-glob.js @@ -116,7 +116,6 @@ export const parseGlobToRegex = memoize( } regexResultStr += currentChar; } - return new RegExp(`^${regexResultStr}$`); }, ); @@ -138,6 +137,15 @@ function isRootGlob(glob) { return glob.startsWith('/') || glob.startsWith('!/') || Boolean(glob.match(/^([A-Z]:\\|\\\\)/)); } +/** + * Makes sure cwd does not end with a slash + * @param {string} str + * @returns {string} + */ +function normalizeCwd(str) { + return str.endsWith('/') ? str.slice(0, -1) : str; +} + /** * @param {DirentWithPath} dirent * @param {{cwd:string}} cfg @@ -369,6 +377,8 @@ export async function optimisedGlob(globOrGlobs, providedOptions = {}) { ...providedOptions, }; + options.cwd = normalizeCwd(options.cwd); + if (!options.onlyFiles) { // This makes behavior aligned with globby options.onlyDirectories = true; @@ -403,6 +413,7 @@ export async function optimisedGlob(globOrGlobs, providedOptions = {}) { globstar: options.globstar, extglob: options.extglob, }); + if (isNegative) { matchRegexesNegative.push(regexForGlob); } else { @@ -416,8 +427,8 @@ export async function optimisedGlob(globOrGlobs, providedOptions = {}) { const fullStartPath = path.join(cwd, startPath); try { const allDirEntsRelativeToCwd = await getAllDirentsRelativeToCwd(fullStartPath, { - cwd, fs: options.fs, + cwd, }); globEntries.push(...allDirEntsRelativeToCwd); diff --git a/packages-node/providence-analytics/test-node/program/utils/optimised-glob.test.js b/packages-node/providence-analytics/test-node/program/utils/optimised-glob.test.js index a6b0683ef..a4d252214 100644 --- a/packages-node/providence-analytics/test-node/program/utils/optimised-glob.test.js +++ b/packages-node/providence-analytics/test-node/program/utils/optimised-glob.test.js @@ -157,6 +157,37 @@ function runSuiteForOptimisedGlob() { 'my/folder/some/file.js', ]); }); + + it('supports patterns like "my", "my/**" and "my/**/*" ', async () => { + const files = await runOptimisedGlobAndCheckGlobbyParity('my/**', testCfg); + + const allMy = [ + 'my/folder/some/anotherFile.d.ts', + 'my/folder/some/anotherFile.js', + 'my/folder/some/file.d.ts', + 'my/folder/some/file.js', + 'my/folder/lvl1/some/anotherFile.d.ts', + 'my/folder/lvl1/some/anotherFile.js', + 'my/folder/lvl1/some/file.d.ts', + 'my/folder/lvl1/some/file.js', + 'my/folder/lvl1/lvl2/some/anotherFile.d.ts', + 'my/folder/lvl1/lvl2/some/anotherFile.js', + 'my/folder/lvl1/lvl2/some/file.d.ts', + 'my/folder/lvl1/lvl2/some/file.js', + 'my/folder/lvl1/lvl2/lvl3/some/anotherFile.d.ts', + 'my/folder/lvl1/lvl2/lvl3/some/anotherFile.js', + 'my/folder/lvl1/lvl2/lvl3/some/file.d.ts', + 'my/folder/lvl1/lvl2/lvl3/some/file.js', + ]; + + expect(files).to.deep.equal(allMy); + + const files2 = await runOptimisedGlobAndCheckGlobbyParity('my/**/*', testCfg); + + expect(files2).to.deep.equal(allMy); + + // TODO: "my" (this will need a code change: preprocess 'my' to 'my/**') + }); }); describe('Accolade patterns', () => { @@ -351,6 +382,15 @@ function runSuiteForOptimisedGlob() { }); expect(files).to.deep.equal(['file.js']); }); + + it('supports cwd ending with "/"', async () => { + const files = await runOptimisedGlobAndCheckGlobbyParity('my/folder/*/some/file.js', { + ...testCfg, + cwd: '/fakeFs/', + }); + + expect(files).to.deep.equal(['my/folder/lvl1/some/file.js']); + }); }); }); }