diff --git a/bin/pretty-quick.js b/bin/pretty-quick.js index 04d6d5c..322fd4a 100755 --- a/bin/pretty-quick.js +++ b/bin/pretty-quick.js @@ -13,6 +13,8 @@ let success = true; prettyQuick( process.cwd(), Object.assign({}, args, { + matchers: args._, + onFoundSinceRevision: (scm, revision) => { console.log( `🔍 Finding changed files since ${chalk.bold( diff --git a/package.json b/package.json index e8a247d..6d46a2e 100644 --- a/package.json +++ b/package.json @@ -28,7 +28,8 @@ "execa": "^0.8.0", "find-up": "^2.1.0", "ignore": "^3.3.7", - "mri": "^1.1.0" + "mri": "^1.1.0", + "multimatch": "3.0.0" }, "scripts": { "prepublishOnly": "yarn build", diff --git a/src/__tests__/scm-git.test.js b/src/__tests__/scm-git.test.js index fafcf00..87288b4 100644 --- a/src/__tests__/scm-git.test.js +++ b/src/__tests__/scm-git.test.js @@ -158,6 +158,36 @@ describe('with git', () => { expect(onWriteFile).toHaveBeenCalledWith('./foo.js'); expect(onWriteFile).toHaveBeenCalledWith('./bar.md'); + expect(onWriteFile.mock.calls.length).toBe(2); + }); + + test('calls onWriteFile with changed files for the given pattern', () => { + const onWriteFile = jest.fn(); + mockGitFs(); + prettyQuick('root', { matchers: ['*.md'], since: 'banana', onWriteFile }); + expect(onWriteFile.mock.calls).toEqual([['./bar.md']]); + }); + + test('calls onWriteFile with changed files for the given globstar pattern', () => { + const onWriteFile = jest.fn(); + mockGitFs(); + prettyQuick('root', { + matchers: ['**/*.md'], + since: 'banana', + onWriteFile, + }); + expect(onWriteFile.mock.calls).toEqual([['./bar.md']]); + }); + + test('calls onWriteFile with changed files for the given extglob pattern', () => { + const onWriteFile = jest.fn(); + mockGitFs(); + prettyQuick('root', { + matchers: ['*.*(md|foo|bar)'], + since: 'banana', + onWriteFile, + }); + expect(onWriteFile.mock.calls).toEqual([['./bar.md']]); }); test('writes formatted files to disk', () => { diff --git a/src/__tests__/scm-hg.test.js b/src/__tests__/scm-hg.test.js index 10a50b9..a2ab46b 100644 --- a/src/__tests__/scm-hg.test.js +++ b/src/__tests__/scm-hg.test.js @@ -116,6 +116,35 @@ describe('with hg', () => { expect(onWriteFile).toHaveBeenCalledWith('./bar.md'); }); + test('calls onWriteFile with changed files for the given pattern', () => { + const onWriteFile = jest.fn(); + mockHgFs(); + prettyQuick('root', { matchers: ['*.md'], since: 'banana', onWriteFile }); + expect(onWriteFile.mock.calls).toEqual([['./bar.md']]); + }); + + test('calls onWriteFile with changed files for the given globstar pattern', () => { + const onWriteFile = jest.fn(); + mockHgFs(); + prettyQuick('root', { + matchers: ['**/*.md'], + since: 'banana', + onWriteFile, + }); + expect(onWriteFile.mock.calls).toEqual([['./bar.md']]); + }); + + test('calls onWriteFile with changed files for the given extglob pattern', () => { + const onWriteFile = jest.fn(); + mockHgFs(); + prettyQuick('root', { + matchers: ['*.*(md|foo|bar)'], + since: 'banana', + onWriteFile, + }); + expect(onWriteFile.mock.calls).toEqual([['./bar.md']]); + }); + test('writes formatted files to disk', () => { const onWriteFile = jest.fn(); diff --git a/src/createMatcher.js b/src/createMatcher.js new file mode 100644 index 0000000..ef3a930 --- /dev/null +++ b/src/createMatcher.js @@ -0,0 +1,11 @@ +import multimatch from 'multimatch'; +import path from 'path'; + +export default patterns => { + if (patterns.length === 0) { + return () => true; + } + return file => { + return multimatch(path.normalize(file), patterns).length !== 0; + }; +}; diff --git a/src/index.js b/src/index.js index 280c831..d4c1ba7 100644 --- a/src/index.js +++ b/src/index.js @@ -1,6 +1,7 @@ import scms from './scms'; import formatFiles from './formatFiles'; import createIgnorer from './createIgnorer'; +import createMatcher from './createMatcher'; import isSupportedExtension from './isSupportedExtension'; export default ( @@ -9,6 +10,7 @@ export default ( config, since, staged, + matchers = [], restage = true, branch, verbose, @@ -38,6 +40,7 @@ export default ( const changedFiles = scm .getChangedFiles(directory, revision, staged) .filter(isSupportedExtension) + .filter(createMatcher(matchers)) .filter(rootIgnorer) .filter(cwdIgnorer); @@ -45,6 +48,7 @@ export default ( ? scm .getUnstagedChangedFiles(directory, revision) .filter(isSupportedExtension) + .filter(createMatcher(matchers)) .filter(rootIgnorer) .filter(cwdIgnorer) : []; diff --git a/yarn.lock b/yarn.lock index 3e3b3c9..9de4ea2 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3130,6 +3130,16 @@ ms@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" +multimatch@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/multimatch/-/multimatch-3.0.0.tgz#0e2534cc6bc238d9ab67e1b9cd5fcd85a6dbf70b" + integrity sha512-22foS/gqQfANZ3o+W7ST2x25ueHDVNWl/b9OlGcLpy/iKxjCpvcNCM51YCenUi7Mt/jAjjqv8JwZRs8YP5sRjA== + dependencies: + array-differ "^2.0.3" + array-union "^1.0.2" + arrify "^1.0.1" + minimatch "^3.0.4" + mute-stream@0.0.7: version "0.0.7" resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab"