From 57d01d538ca79a271bfa72c728eefdcac29df503 Mon Sep 17 00:00:00 2001 From: magicdawn Date: Sat, 23 Jul 2022 04:40:02 +0800 Subject: [PATCH 1/2] feat: remove scoped package / when pattern without / --- src/lib/filterAndReject.ts | 9 ++++++- test/filter.test.ts | 50 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 58 insertions(+), 1 deletion(-) diff --git a/src/lib/filterAndReject.ts b/src/lib/filterAndReject.ts index f27cdb0c..616c8a2b 100644 --- a/src/lib/filterAndReject.ts +++ b/src/lib/filterAndReject.ts @@ -31,7 +31,14 @@ function composeFilter(filterPattern: FilterRejectPattern): (name: string, versi // glob string else { const patterns = filterPattern.split(/[\s,]+/) - predicate = (dependencyName: string) => patterns.some(pattern => minimatch(dependencyName, pattern)) + predicate = (dependencyName: string) => + patterns.some( + pattern => + minimatch(dependencyName, pattern) || + (!pattern.includes('/') && + dependencyName.includes('/') && + minimatch(dependencyName.replace(/\//g, '_'), pattern)), + ) } } // array diff --git a/test/filter.test.ts b/test/filter.test.ts index 3da3dc08..cfa18e04 100644 --- a/test/filter.test.ts +++ b/test/filter.test.ts @@ -41,6 +41,56 @@ describe('filter', () => { upgraded.should.have.property('lodash.filter') }) + it('filter with wildcard for scoped package', async () => { + // eslint-disable-next-line jsdoc/require-jsdoc + const withFilter = (filter: string[]) => + ncu({ + packageData: { + dependencies: { + vite: '1.0.0', + '@vitejs/plugin-react': '1.0.0', + '@vitejs/plugin-vue': '1.0.0', + }, + }, + filter, + }) as Promise> + + { + const upgraded = await withFilter(['vite']) + upgraded.should.have.property('vite') + upgraded.should.not.have.property('@vitejs/plugin-react') + upgraded.should.not.have.property('@vitejs/plugin-vue') + } + + { + const upgraded = await withFilter(['@vite*']) + upgraded.should.not.have.property('vite') + upgraded.should.have.property('@vitejs/plugin-react') + upgraded.should.have.property('@vitejs/plugin-vue') + } + + { + const upgraded = await withFilter(['*vite*']) + upgraded.should.have.property('vite') + upgraded.should.have.property('@vitejs/plugin-react') + upgraded.should.have.property('@vitejs/plugin-vue') + } + + { + const upgraded = await withFilter(['*vite*/*react*']) + upgraded.should.not.have.property('vite') + upgraded.should.have.property('@vitejs/plugin-react') + upgraded.should.not.have.property('@vitejs/plugin-vue') + } + + { + const upgraded = await withFilter(['*vite*vue*']) + upgraded.should.not.have.property('vite') + upgraded.should.not.have.property('@vitejs/plugin-react') + upgraded.should.have.property('@vitejs/plugin-vue') + } + }) + it('filter with negated wildcard', async () => { const upgraded = (await ncu({ packageData: { From b2817fad973bec7e2e42ed173d7964e3943deb47 Mon Sep 17 00:00:00 2001 From: Raine Revere Date: Fri, 22 Jul 2022 15:18:11 -0600 Subject: [PATCH 2/2] Clean up filter and tests. --- src/lib/filterAndReject.ts | 23 +++++++++------ test/filter.test.ts | 59 +++++++++++++++++--------------------- 2 files changed, 41 insertions(+), 41 deletions(-) diff --git a/src/lib/filterAndReject.ts b/src/lib/filterAndReject.ts index 616c8a2b..1fdf0a5a 100644 --- a/src/lib/filterAndReject.ts +++ b/src/lib/filterAndReject.ts @@ -1,4 +1,4 @@ -import { and } from 'fp-and-or' +import { and, or } from 'fp-and-or' import identity from 'lodash/identity' import negate from 'lodash/negate' import minimatch from 'minimatch' @@ -31,14 +31,19 @@ function composeFilter(filterPattern: FilterRejectPattern): (name: string, versi // glob string else { const patterns = filterPattern.split(/[\s,]+/) - predicate = (dependencyName: string) => - patterns.some( - pattern => - minimatch(dependencyName, pattern) || - (!pattern.includes('/') && - dependencyName.includes('/') && - minimatch(dependencyName.replace(/\//g, '_'), pattern)), - ) + predicate = (dependencyName: string) => { + /** Returns true if the pattern matches an unscoped dependency name. */ + const matchUnscoped = (pattern: string) => minimatch(dependencyName, pattern) + + /** Returns true if the pattern matches a scoped dependency name. */ + const matchScoped = (pattern: string) => + !pattern.includes('/') && + dependencyName.includes('/') && + minimatch(dependencyName.replace(/\//g, '_'), pattern) + + // return true if any of the provided patterns match the dependency name + return patterns.some(or(matchUnscoped, matchScoped)) + } } } // array diff --git a/test/filter.test.ts b/test/filter.test.ts index cfa18e04..2e3bb54e 100644 --- a/test/filter.test.ts +++ b/test/filter.test.ts @@ -42,52 +42,47 @@ describe('filter', () => { }) it('filter with wildcard for scoped package', async () => { - // eslint-disable-next-line jsdoc/require-jsdoc - const withFilter = (filter: string[]) => - ncu({ - packageData: { - dependencies: { - vite: '1.0.0', - '@vitejs/plugin-react': '1.0.0', - '@vitejs/plugin-vue': '1.0.0', - }, - }, - filter, - }) as Promise> + const pkg = { + dependencies: { + vite: '1.0.0', + '@vitejs/plugin-react': '1.0.0', + '@vitejs/plugin-vue': '1.0.0', + }, + } { - const upgraded = await withFilter(['vite']) - upgraded.should.have.property('vite') - upgraded.should.not.have.property('@vitejs/plugin-react') - upgraded.should.not.have.property('@vitejs/plugin-vue') + const upgraded = await ncu({ packageData: pkg, filter: ['vite'] }) + upgraded!.should.have.property('vite') + upgraded!.should.not.have.property('@vitejs/plugin-react') + upgraded!.should.not.have.property('@vitejs/plugin-vue') } { - const upgraded = await withFilter(['@vite*']) - upgraded.should.not.have.property('vite') - upgraded.should.have.property('@vitejs/plugin-react') - upgraded.should.have.property('@vitejs/plugin-vue') + const upgraded = await ncu({ packageData: pkg, filter: ['@vite*'] }) + upgraded!.should.not.have.property('vite') + upgraded!.should.have.property('@vitejs/plugin-react') + upgraded!.should.have.property('@vitejs/plugin-vue') } { - const upgraded = await withFilter(['*vite*']) - upgraded.should.have.property('vite') - upgraded.should.have.property('@vitejs/plugin-react') - upgraded.should.have.property('@vitejs/plugin-vue') + const upgraded = await ncu({ packageData: pkg, filter: ['*vite*'] }) + upgraded!.should.have.property('vite') + upgraded!.should.have.property('@vitejs/plugin-react') + upgraded!.should.have.property('@vitejs/plugin-vue') } { - const upgraded = await withFilter(['*vite*/*react*']) - upgraded.should.not.have.property('vite') - upgraded.should.have.property('@vitejs/plugin-react') - upgraded.should.not.have.property('@vitejs/plugin-vue') + const upgraded = await ncu({ packageData: pkg, filter: ['*vite*/*react*'] }) + upgraded!.should.not.have.property('vite') + upgraded!.should.have.property('@vitejs/plugin-react') + upgraded!.should.not.have.property('@vitejs/plugin-vue') } { - const upgraded = await withFilter(['*vite*vue*']) - upgraded.should.not.have.property('vite') - upgraded.should.not.have.property('@vitejs/plugin-react') - upgraded.should.have.property('@vitejs/plugin-vue') + const upgraded = await ncu({ packageData: pkg, filter: ['*vite*vue*'] }) + upgraded!.should.not.have.property('vite') + upgraded!.should.not.have.property('@vitejs/plugin-react') + upgraded!.should.have.property('@vitejs/plugin-vue') } })