diff --git a/src/package.ts b/src/package.ts index 34ae3c6d..ba47ad7d 100644 --- a/src/package.ts +++ b/src/package.ts @@ -1717,8 +1717,8 @@ function collectFiles( Promise.reject(err) : // No .vscodeignore file exists manifestFileIncludes ? - // include all files in manifestFileIncludes and ignore the rest - Promise.resolve(manifestFileIncludes.map(file => `!${file}`).concat(['**']).join('\n\r')) : + // ignore all, and then include all files in manifestFileIncludes + Promise.resolve(['**', ...manifestFileIncludes.map(file => file[0] === '!' ? file.slice(1) : `!${file}`)].join('\n\r')) : // "files" property not used in package.json Promise.resolve('') ) @@ -1733,30 +1733,29 @@ function collectFiles( ) // Add '/**' to possible folder names - .then(ignore => [ - ...ignore, - ...ignore.filter(i => !/(^|\/)[^/]*\*[^/]*$/.test(i)).map(i => (/\/$/.test(i) ? `${i}**` : `${i}/**`)), - ]) + .then(ignore => + ignore.map(i => !/(^|\/)[^/]*\*[^/]*$/.test(i) + ? [ + i, + /\/$/.test(i) + ? `${i}**` + : `${i}/**` + ] + : [i] + ).flat(), + ) // Combine with default ignore list .then(ignore => [...defaultIgnore, ...ignore, ...notIgnored]) - // Split into ignore and negate list + // Check the ignore list in order to filter out files .then(ignore => - ignore.reduce<[string[], string[]]>( - (r, e) => (!/^\s*!/.test(e) ? [[...r[0], e], r[1]] : [r[0], [...r[1], e]]), - [[], []] - ) - ) - .then(r => ({ ignore: r[0], negate: r[1] })) - - // Filter out files - .then(({ ignore, negate }) => - files.filter( - f => - !ignore.some(i => minimatch(f, i, MinimatchOptions)) || - negate.some(i => minimatch(f, i.substr(1), MinimatchOptions)) - ) + files.filter(f=> ignore.reduce((keep, i) => i[0] === '!' + ? keep || minimatch(f, i.slice(1), MinimatchOptions) + : keep && !minimatch(f, i, MinimatchOptions), + true + )) + ) ); }); @@ -2075,7 +2074,7 @@ export async function printAndValidatePackagedFiles(files: IFile[], cwd: string, // the package does not include at least one file for each include pattern else if (manifest.files !== undefined && manifest.files.length > 0 && !options.allowUnusedFilesPattern) { const localPaths = files.map(f => util.normalize(f.originalPath ?? (!isInMemoryFile(f) ? f.localPath : path.join(cwd, f.path)))); - const filesIncludePatterns = manifest.files.map(includePattern => ({ absolute: util.normalize(path.join(cwd, includePattern)), relative: includePattern })); + const filesIncludePatterns = manifest.files.filter(includePattern => includePattern[0] !== '!').map(includePattern => ({ absolute: util.normalize(path.join(cwd, includePattern)), relative: includePattern })); const unusedIncludePatterns = filesIncludePatterns.filter(includePattern => { let absoluteIncludePattern = includePattern.absolute; diff --git a/src/test/fixtures/manifestFiles/foo/bar/exclude.me b/src/test/fixtures/manifestFiles/foo/bar/exclude.me new file mode 100644 index 00000000..31ba3b47 --- /dev/null +++ b/src/test/fixtures/manifestFiles/foo/bar/exclude.me @@ -0,0 +1 @@ +should be ignored as it's listed as excluded in the package.json files list. diff --git a/src/test/fixtures/manifestFiles/fooExclude/excluded.txt b/src/test/fixtures/manifestFiles/fooExclude/excluded.txt new file mode 100644 index 00000000..e69de29b diff --git a/src/test/fixtures/manifestFiles/fooExclude/includeNotPossible.txt b/src/test/fixtures/manifestFiles/fooExclude/includeNotPossible.txt new file mode 100644 index 00000000..e69de29b diff --git a/src/test/fixtures/manifestFiles/fooInclude/excluded.txt b/src/test/fixtures/manifestFiles/fooInclude/excluded.txt new file mode 100644 index 00000000..e69de29b diff --git a/src/test/fixtures/manifestFiles/fooInclude/included.txt b/src/test/fixtures/manifestFiles/fooInclude/included.txt new file mode 100644 index 00000000..e69de29b diff --git a/src/test/fixtures/manifestFiles/package.json b/src/test/fixtures/manifestFiles/package.json index ee4afe51..7732243d 100644 --- a/src/test/fixtures/manifestFiles/package.json +++ b/src/test/fixtures/manifestFiles/package.json @@ -7,7 +7,12 @@ }, "files": [ "foo", + "!**/exclude.me", "foo2/bar2/include.me", + "!fooExclude/**", + "fooExclude/includeNotPossible.txt", + "fooInclude/**", + "!fooInclude/excluded.txt", "*/bar3/**", "package.json", "LICENSE", diff --git a/src/test/package.test.ts b/src/test/package.test.ts index d2e1788b..52d21747 100644 --- a/src/test/package.test.ts +++ b/src/test/package.test.ts @@ -252,6 +252,7 @@ describe('collect', function () { 'extension/foo/bar/hello.txt', 'extension/foo2/bar2/include.me', 'extension/foo3/bar3/hello.txt', + 'extension/fooInclude/included.txt', 'extension/package.json', 'extension/readme.md', ]);