mirror of
https://github.com/nodejs/node.git
synced 2026-10-28 18:25:13 +08:00
Glob matchers capture the path platform when they are created. Include the platform in the cache key so path.posix and path.win32 do not share incompatible matchers for the same pattern. Signed-off-by: Archkon <180910180+Archkon@users.noreply.github.com> PR-URL: https://github.com/nodejs/node/pull/64571 Fixes: https://github.com/nodejs/node/issues/64570 Reviewed-By: James M Snell <jasnell@gmail.com> Reviewed-By: Aviv Keller <me@aviv.sh> Reviewed-By: Moshe Atlow <moshe@atlow.co.il>
48 lines
2.8 KiB
JavaScript
48 lines
2.8 KiB
JavaScript
'use strict';
|
|
|
|
require('../common');
|
|
const assert = require('assert');
|
|
const path = require('path');
|
|
|
|
const globs = {
|
|
win32: [
|
|
['foo\\bar\\baz', 'foo\\[bcr]ar\\baz', true], // Matches 'bar' or 'car' in 'foo\\bar'
|
|
['foo\\bar\\baz', 'foo\\[!bcr]ar\\baz', false], // Matches anything except 'bar' or 'car' in 'foo\\bar'
|
|
['foo\\bar\\baz', 'foo\\[bc-r]ar\\baz', true], // Matches 'bar' or 'car' using range in 'foo\\bar'
|
|
['foo\\bar\\baz', 'foo\\*\\!bar\\*\\baz', false], // Matches anything with 'foo' and 'baz' but not 'bar' in between
|
|
['foo\\bar1\\baz', 'foo\\bar[0-9]\\baz', true], // Matches 'bar' followed by any digit in 'foo\\bar1'
|
|
['foo\\bar5\\baz', 'foo\\bar[0-9]\\baz', true], // Matches 'bar' followed by any digit in 'foo\\bar5'
|
|
['foo\\barx\\baz', 'foo\\bar[a-z]\\baz', true], // Matches 'bar' followed by any lowercase letter in 'foo\\barx'
|
|
['foo\\bar\\baz\\boo', 'foo\\[bc-r]ar\\baz\\*', true], // Matches 'bar' or 'car' in 'foo\\bar'
|
|
['foo\\bar\\baz', 'foo/**', true], // Matches anything in 'foo'
|
|
['foo\\bar\\baz', '*', false], // No match
|
|
],
|
|
posix: [
|
|
['foo/bar/baz', 'foo/[bcr]ar/baz', true], // Matches 'bar' or 'car' in 'foo/bar'
|
|
['foo/bar/baz', 'foo/[!bcr]ar/baz', false], // Matches anything except 'bar' or 'car' in 'foo/bar'
|
|
['foo/bar/baz', 'foo/[bc-r]ar/baz', true], // Matches 'bar' or 'car' using range in 'foo/bar'
|
|
['foo/bar/baz', 'foo/*/!bar/*/baz', false], // Matches anything with 'foo' and 'baz' but not 'bar' in between
|
|
['foo/bar1/baz', 'foo/bar[0-9]/baz', true], // Matches 'bar' followed by any digit in 'foo/bar1'
|
|
['foo/bar5/baz', 'foo/bar[0-9]/baz', true], // Matches 'bar' followed by any digit in 'foo/bar5'
|
|
['foo/barx/baz', 'foo/bar[a-z]/baz', true], // Matches 'bar' followed by any lowercase letter in 'foo/barx'
|
|
['foo/bar/baz/boo', 'foo/[bc-r]ar/baz/*', true], // Matches 'bar' or 'car' in 'foo/bar'
|
|
['foo/bar/baz', 'foo/**', true], // Matches anything in 'foo'
|
|
['foo/bar/baz', '*', false], // No match
|
|
],
|
|
};
|
|
|
|
// Matchers for the same pattern must not be shared across path platforms.
|
|
assert.strictEqual(path.posix.matchesGlob('platform-cache/file', 'platform-cache/**'), true);
|
|
assert.strictEqual(path.win32.matchesGlob('platform-cache\\file', 'platform-cache/**'), true);
|
|
|
|
for (const [platform, platformGlobs] of Object.entries(globs)) {
|
|
for (const [pathStr, glob, expected] of platformGlobs) {
|
|
const actual = path[platform].matchesGlob(pathStr, glob);
|
|
assert.strictEqual(actual, expected, `Expected ${pathStr} to ` + (expected ? '' : 'not ') + `match ${glob} on ${platform}`);
|
|
}
|
|
}
|
|
|
|
// Test for non-string input
|
|
assert.throws(() => path.matchesGlob(123, 'foo/bar/baz'), /.*must be of type string.*/);
|
|
assert.throws(() => path.matchesGlob('foo/bar/baz', 123), /.*must be of type string.*/);
|