From c552380e1ca16943f00032da8179c42f122d2fce Mon Sep 17 00:00:00 2001 From: Jason Dent Date: Tue, 21 May 2024 15:11:15 +0200 Subject: [PATCH] chore: verify that micromatch update does not break CSpell. --- packages/cspell-glob/package.json | 2 +- packages/cspell-glob/src/GlobMatcher.test.ts | 69 +++++++++++++------- packages/cspell/package.json | 2 +- packages/cspell/src/app/util/glob.test.ts | 2 +- pnpm-lock.yaml | 52 +++++++++------ 5 files changed, 78 insertions(+), 49 deletions(-) diff --git a/packages/cspell-glob/package.json b/packages/cspell-glob/package.json index 90aeb8fafa83..bc7c5f6e0dc2 100644 --- a/packages/cspell-glob/package.json +++ b/packages/cspell-glob/package.json @@ -50,7 +50,7 @@ "node": ">=18" }, "dependencies": { - "micromatch": "4.0.5" + "micromatch": "^4.0.6" }, "devDependencies": { "@types/micromatch": "^4.0.7" diff --git a/packages/cspell-glob/src/GlobMatcher.test.ts b/packages/cspell-glob/src/GlobMatcher.test.ts index b2a30f770833..197b03d12415 100644 --- a/packages/cspell-glob/src/GlobMatcher.test.ts +++ b/packages/cspell-glob/src/GlobMatcher.test.ts @@ -12,6 +12,7 @@ import type { GlobPatternWithOptionalRoot, PathInterface, } from './GlobMatcherTypes.js'; +import { fileURLToPath } from 'node:url'; const defaultCwdWin32 = 'C:\\user\\home\\project\\testing'; const defaultCwdPosix = '/user/home/project/testing'; @@ -26,6 +27,8 @@ const pathPosix: PathInterface = { resolve: (...paths) => path.posix.resolve(defaultCwdPosix, ...paths), }; +const __filename = fileURLToPath(import.meta.url); + const pathNames = new Map([ [pathWin32, 'Win32'], [pathPosix, 'Posix'], @@ -55,34 +58,37 @@ describe('Validate assumptions', () => { describe('Validate Micromatch assumptions', () => { test.each` - glob | filename | expectedToMatch - ${'*.json'} | ${'settings.json'} | ${true} - ${'*.json'} | ${'/settings.json'} | ${false} - ${'*.json'} | ${'src/settings.json'} | ${false} - ${'*.json'} | ${'/src/settings.json'} | ${false} - ${'**/*.json'} | ${'settings.json'} | ${true} - ${'**/*.json'} | ${'/settings.json'} | ${true} - ${'**/*.json'} | ${'src/settings.json'} | ${true} - ${'**/*.json'} | ${'/src/settings.json'} | ${true} - ${'**/temp'} | ${'/src/temp/data.json'} | ${false} - ${'**/temp/'} | ${'/src/temp/data.json'} | ${false} - ${'**/temp/**'} | ${'/src/temp/data.json'} | ${true} - ${'src/*.json'} | ${'src/settings.json'} | ${true} - ${'**/{*.json,*.json/**}'} | ${'settings.json'} | ${true} - ${'**/{*.json,*.json/**}'} | ${'/settings.json'} | ${true} - ${'**/{*.json,*.json/**}'} | ${'src/settings.json'} | ${true} - ${'**/{*.json,*.json/**}'} | ${'src/settings.json/config'} | ${true} - ${'**/{*.json,*.json/**}'} | ${'settings.json/config'} | ${true} - ${'src/*.{test,spec}.ts'} | ${'src/code.test.ts'} | ${true} - ${'src/*.(test|spec).ts'} | ${'src/code.test.ts'} | ${true} - ${'src/*.(test|spec).ts'} | ${'src/code.spec.ts'} | ${true} - ${'src/*.(test|spec).ts'} | ${'src/deep.code.test.ts'} | ${true} - ${'src/*.(test|spec).ts'} | ${'src/test.ts'} | ${false} + glob | filename | expectedToMatch + ${'*.json'} | ${'settings.json'} | ${true} + ${'*.json'} | ${'/settings.json'} | ${false} + ${'*.json'} | ${'src/settings.json'} | ${false} + ${'*.json'} | ${'/src/settings.json'} | ${false} + ${'**/*.json'} | ${'settings.json'} | ${true} + ${'**/*.json'} | ${'/settings.json'} | ${true} + ${'**/*.json'} | ${'src/settings.json'} | ${true} + ${'**/*.json'} | ${'/src/settings.json'} | ${true} + ${'**/temp'} | ${'/src/temp/data.json'} | ${false} + ${'**/temp/'} | ${'/src/temp/data.json'} | ${false} + ${'**/temp/**'} | ${'/src/temp/data.json'} | ${true} + ${'src/*.json'} | ${'src/settings.json'} | ${true} + ${'**/{*.json,*.json/**}'} | ${'settings.json'} | ${true} + ${'**/{*.json,*.json/**}'} | ${'/settings.json'} | ${true} + ${'**/{*.json,*.json/**}'} | ${'src/settings.json'} | ${true} + ${'**/{*.json,*.json/**}'} | ${'src/settings.json/config'} | ${true} + ${'**/{*.json,*.json/**}'} | ${'settings.json/config'} | ${true} + ${'src/*.{test,spec}.ts'} | ${'src/code.test.ts'} | ${true} + ${'src/*.(test|spec).ts'} | ${'src/code.test.ts'} | ${true} + ${'src/*.(test|spec).ts'} | ${'src/code.spec.ts'} | ${true} + ${'src/*.(test|spec).ts'} | ${'src/deep.code.test.ts'} | ${true} + ${'src/*.(test|spec).ts'} | ${'src/test.ts'} | ${false} + ${filenameToGlob(__filename, 1)} | ${__filename} | ${true} + ${filenameToGlob(__filename, 2)} | ${__filename} | ${true} `( `Micromatch glob: '$glob', filename: '$filename' expected: $expectedToMatch`, ({ glob, filename, expectedToMatch }) => { - const reg1 = mm.makeRe(glob); - expect(reg1.test(filename)).toEqual(expectedToMatch); + const reg = mm.makeRe(glob); + expect(reg.test(filename)).toEqual(expectedToMatch); + expect(mm.isMatch(filename, glob, { windows: path.sep === '\\' })).toBe(expectedToMatch); }, ); }); @@ -123,6 +129,14 @@ function resolveFilename(pathInstance: PathInterface, filename: string | undefin }); }); +describe('Validate GlobMatcher on Windows', () => { + test('Make sure it works on Windows', () => { + const glob = filenameToGlob(__filename, 3); + const matcher = new GlobMatcher(glob); + expect(matcher.match(__filename)).toBe(true); + }); +}); + describe('Tests .gitignore file contents', () => { const pattern = ` # This is a comment @@ -692,3 +706,8 @@ function resolvePattern(p: GlobPattern | GlobPattern[], path: PathInterface): Gl root: path.resolve(p.root), }; } + +function filenameToGlob(filename: string, segments: number = 1) { + const parts = filename.split(path.sep).slice(-segments).join('/'); + return '**/' + parts; +} diff --git a/packages/cspell/package.json b/packages/cspell/package.json index c5435c071ce6..90c5eaf84e49 100644 --- a/packages/cspell/package.json +++ b/packages/cspell/package.json @@ -109,7 +109,7 @@ "@types/glob": "^8.1.0", "@types/micromatch": "^4.0.7", "@types/semver": "^7.5.8", - "micromatch": "^4.0.5", + "micromatch": "^4.0.6", "minimatch": "^9.0.4" } } diff --git a/packages/cspell/src/app/util/glob.test.ts b/packages/cspell/src/app/util/glob.test.ts index 0e3f6afd2bce..69666848fdfd 100644 --- a/packages/cspell/src/app/util/glob.test.ts +++ b/packages/cspell/src/app/util/glob.test.ts @@ -264,7 +264,7 @@ describe('Validate internal functions', () => { const relToRoot = path.relative(root, file); expect(globMatcher.match(file)).toBe(expectedToMatch); - expect(micromatch.isMatch(relToRoot, expectedGlobs)).toBe(expectedToMatch); + expect(micromatch.isMatch(relToRoot, expectedGlobs, { windows: path.sep === '\\' })).toBe(expectedToMatch); }, ); }); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 1f87571cfeed..a3cdbe1e7d6d 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -263,8 +263,8 @@ importers: specifier: ^7.5.8 version: 7.5.8 micromatch: - specifier: ^4.0.5 - version: 4.0.5 + specifier: ^4.0.6 + version: 4.0.6 minimatch: specifier: ^9.0.4 version: 9.0.4 @@ -544,8 +544,8 @@ importers: packages/cspell-glob: dependencies: micromatch: - specifier: 4.0.5 - version: 4.0.5 + specifier: ^4.0.6 + version: 4.0.6 devDependencies: '@types/micromatch': specifier: ^4.0.7 @@ -3762,7 +3762,7 @@ packages: jiti: 1.21.0 js-yaml: 4.1.0 lodash: 4.17.21 - micromatch: 4.0.5 + micromatch: 4.0.6 prompts: 2.4.2 resolve-pathname: 3.0.0 shelljs: 0.8.5 @@ -4411,7 +4411,7 @@ packages: jest-util: 29.7.0 jest-validate: 29.7.0 jest-watcher: 29.7.0 - micromatch: 4.0.5 + micromatch: 4.0.6 pretty-format: 29.7.0 slash: 3.0.0 strip-ansi: 6.0.1 @@ -4559,7 +4559,7 @@ packages: jest-haste-map: 29.7.0 jest-regex-util: 29.6.3 jest-util: 29.7.0 - micromatch: 4.0.5 + micromatch: 4.0.6 pirates: 4.0.6 slash: 3.0.0 write-file-atomic: 4.0.2 @@ -7101,7 +7101,13 @@ packages: resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} engines: {node: '>=8'} dependencies: - fill-range: 7.0.1 + fill-range: 7.1.1 + + /braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} + engines: {node: '>=8'} + dependencies: + fill-range: 7.1.1 /browser-stdout@1.3.1: resolution: {integrity: sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==} @@ -9549,7 +9555,7 @@ packages: '@nodelib/fs.walk': 1.2.8 glob-parent: 5.1.2 merge2: 1.4.1 - micromatch: 4.0.5 + micromatch: 4.0.6 /fast-json-stable-stringify@2.1.0: resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} @@ -9635,8 +9641,8 @@ packages: engines: {node: '>= 0.4.0'} dev: false - /fill-range@7.0.1: - resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} + /fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} engines: {node: '>=8'} dependencies: to-regex-range: 5.0.1 @@ -10576,7 +10582,7 @@ packages: http-proxy: 1.18.1 is-glob: 4.0.3 is-plain-obj: 3.0.0 - micromatch: 4.0.5 + micromatch: 4.0.6 transitivePeerDependencies: - debug dev: false @@ -11443,7 +11449,7 @@ packages: jest-runner: 29.7.0 jest-util: 29.7.0 jest-validate: 29.7.0 - micromatch: 4.0.5 + micromatch: 4.0.6 parse-json: 5.2.0 pretty-format: 29.7.0 slash: 3.0.0 @@ -11484,7 +11490,7 @@ packages: jest-runner: 29.7.0 jest-util: 29.7.0 jest-validate: 29.7.0 - micromatch: 4.0.5 + micromatch: 4.0.6 parse-json: 5.2.0 pretty-format: 29.7.0 slash: 3.0.0 @@ -11551,7 +11557,7 @@ packages: jest-regex-util: 29.6.3 jest-util: 29.7.0 jest-worker: 29.7.0 - micromatch: 4.0.5 + micromatch: 4.0.6 walker: 1.0.8 optionalDependencies: fsevents: 2.3.3 @@ -11584,7 +11590,7 @@ packages: '@types/stack-utils': 2.0.3 chalk: 4.1.2 graceful-fs: 4.2.11 - micromatch: 4.0.5 + micromatch: 4.0.6 pretty-format: 29.7.0 slash: 3.0.0 stack-utils: 2.0.6 @@ -12819,12 +12825,12 @@ packages: transitivePeerDependencies: - supports-color - /micromatch@4.0.5: - resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} + /micromatch@4.0.6: + resolution: {integrity: sha512-Y4Ypn3oujJYxJcMacVgcs92wofTHxp9FzfDpQON4msDefoC0lb3ETvQLOdLcbhSwU1bz8HrL/1sygfBIHudrkQ==} engines: {node: '>=8.6'} dependencies: - braces: 3.0.2 - picomatch: 2.3.1 + braces: 3.0.3 + picomatch: 4.0.2 /mime-db@1.33.0: resolution: {integrity: sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==} @@ -13866,6 +13872,10 @@ packages: resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} engines: {node: '>=8.6'} + /picomatch@4.0.2: + resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==} + engines: {node: '>=12'} + /pify@6.1.0: resolution: {integrity: sha512-KocF8ve28eFjjuBKKGvzOBGzG8ew2OqOOSxTTZhirkzH7h3BI1vyzqlR0qbfcDBve1Yzo3FVlWUAtCRrbVN8Fw==} engines: {node: '>=14.16'} @@ -16237,7 +16247,7 @@ packages: dependencies: chalk: 4.1.2 enhanced-resolve: 5.16.1 - micromatch: 4.0.5 + micromatch: 4.0.6 semver: 7.6.2 source-map: 0.7.4 typescript: 5.4.5