|
| 1 | +import * as Path from 'path'; |
| 2 | +import { Minimatch } from 'minimatch'; |
| 3 | + |
| 4 | +import isEqual = require('lodash/isEqual'); |
| 5 | +import Assert = require('assert'); |
| 6 | + |
| 7 | +import { createMinimatch } from '..'; |
| 8 | + |
| 9 | +// Used to ensure uniform path cross OS |
| 10 | +const absolutePath = (path: string) => Path.resolve(path.replace(/^\w:/, '')).replace(/[\\]/g, '/'); |
| 11 | + |
| 12 | +describe('Paths', () => { |
| 13 | + describe('createMinimatch', () => { |
| 14 | + it('Converts an array of paths to an array of Minimatch expressions', () => { |
| 15 | + const mms = createMinimatch(['/some/path/**', '**/another/path/**', './relative/**/path']); |
| 16 | + Assert(Array.isArray(mms), 'Didn\'t return an array'); |
| 17 | + |
| 18 | + const allAreMm = mms.every((mm) => mm instanceof Minimatch); |
| 19 | + Assert(allAreMm, 'Not all paths are coverted to Minimatch'); |
| 20 | + }); |
| 21 | + |
| 22 | + it('Minimatch can match absolute paths expressions', () => { |
| 23 | + const paths = ['/unix/absolute/**/path', '\\windows\\alternative\\absolute\\path', 'C:\\Windows\\absolute\\*\\path', '**/arbitrary/path/**']; |
| 24 | + const mms = createMinimatch(paths); |
| 25 | + const patterns = mms.map(({ pattern }) => pattern); |
| 26 | + const comparePaths = [ |
| 27 | + absolutePath('/unix/absolute/**/path'), |
| 28 | + absolutePath('/windows/alternative/absolute/path'), |
| 29 | + absolutePath('/Windows/absolute/*/path'), |
| 30 | + '**/arbitrary/path/**' |
| 31 | + ]; |
| 32 | + |
| 33 | + Assert(isEqual(patterns, comparePaths), `Patterns have been altered:\nMMS: ${patterns}\nPaths: ${comparePaths}`); |
| 34 | + |
| 35 | + Assert(mms[0].match(absolutePath('/unix/absolute/some/sub/dir/path')), 'Din\'t match unix path'); |
| 36 | + Assert(mms[1].match(absolutePath('/windows/alternative/absolute/path')), 'Din\'t match windows alternative path'); |
| 37 | + Assert(mms[2].match(absolutePath('/Windows/absolute/test/path')), 'Din\'t match windows path'); |
| 38 | + Assert(mms[3].match(absolutePath('/some/deep/arbitrary/path/leading/nowhere')), 'Din\'t match arbitrary path'); |
| 39 | + }); |
| 40 | + |
| 41 | + it('Minimatch can match relative to the project root', () => { |
| 42 | + const paths = ['./relative/**/path', '../parent/*/path', 'no/dot/relative/**/path/*', '*/subdir/**/path/*', '.dot/relative/**/path/*']; |
| 43 | + const absPaths = paths.map((path) => absolutePath(path)); |
| 44 | + const mms = createMinimatch(paths); |
| 45 | + const patterns = mms.map(({ pattern }) => pattern); |
| 46 | + |
| 47 | + Assert(isEqual(patterns, absPaths), `Project root have not been added to paths:\nMMS: ${patterns}\nPaths: ${absPaths}`); |
| 48 | + |
| 49 | + Assert(mms[0].match(Path.resolve('relative/some/sub/dir/path')), 'Din\'t match relative path'); |
| 50 | + Assert(mms[1].match(Path.resolve('../parent/dir/path')), 'Din\'t match parent path'); |
| 51 | + Assert(mms[2].match(Path.resolve('no/dot/relative/some/sub/dir/path/test')), 'Din\'t match no dot path'); |
| 52 | + Assert(mms[3].match(Path.resolve('some/subdir/path/here')), 'Din\'t match single star path'); |
| 53 | + Assert(mms[4].match(Path.resolve('.dot/relative/some/sub/dir/path/test')), 'Din\'t match dot path'); |
| 54 | + }); |
| 55 | + |
| 56 | + it('Minimatch matches dot files', () => { |
| 57 | + const mm = createMinimatch(['/some/path/**'])[0]; |
| 58 | + Assert(mm.match(absolutePath('/some/path/.dot/dir')), 'Didn\'t match .dot path'); |
| 59 | + Assert(mm.match(absolutePath('/some/path/normal/dir')), 'Didn\'t match normal path'); |
| 60 | + }); |
| 61 | + }); |
| 62 | +}); |
0 commit comments