From 6fe7e9efc88893347b73c3aa878bdd4d4a9fc81a Mon Sep 17 00:00:00 2001 From: SrTobi Date: Fri, 18 Dec 2015 20:10:07 +0100 Subject: [PATCH 1/3] Added getDependencyFiles with npm child_process --- src/npmdeps.ts | 44 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) create mode 100644 src/npmdeps.ts diff --git a/src/npmdeps.ts b/src/npmdeps.ts new file mode 100644 index 0000000..c919077 --- /dev/null +++ b/src/npmdeps.ts @@ -0,0 +1,44 @@ +import * as pth from 'path'; +import * as _glob from 'glob'; +import * as denodeify from 'denodeify'; +import * as child_process from 'child_process'; + +const glob = denodeify(_glob); + + +function flatten(arr: T[][]): T[] { + return [].concat.apply([], arr) as T[]; +} + +function globFiles(cwd: string, moduleDirs: string[]): Promise { + return Promise.all(moduleDirs.map(dir => glob('**', { cwd: dir, nodir: true, dot: true, ignore: "node_modules/**" }) + .then(filepaths => { + return filepaths.map(filepath => pth.relative(cwd, pth.join(dir, filepath))) + .map(filepath => filepath.replace(/\\/g, '/')) + }))) + .then(moduleFiles => flatten(moduleFiles)); +} + +function npmProdDeps(cwd: string): Promise { + return new Promise((resolve, reject) => { + child_process.exec("npm list --production --parseable --depth", {cwd: cwd}, + (error, stdout, stderr) => { + if (error) { + reject(error); + } + + let moduleDirs = stdout.toString() + .split("\n") + .filter(dir => pth.isAbsolute(dir)); + + resolve(moduleDirs); + } + ) + + }); +} + +export function getDependencyFiles(cwd: string): Promise { + return npmProdDeps(cwd) + .then(ps => globFiles(cwd, ps)); +} \ No newline at end of file From 34a862c6c1cd85b237fbcda699b371f292a3cedb Mon Sep 17 00:00:00 2001 From: SrTobi Date: Fri, 18 Dec 2015 20:11:37 +0100 Subject: [PATCH 2/3] replaced devDependenciesIgnore with real npm dependency finder --- src/package.ts | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/src/package.ts b/src/package.ts index 7754667..a26d25e 100644 --- a/src/package.ts +++ b/src/package.ts @@ -11,6 +11,7 @@ import * as denodeify from 'denodeify'; import * as mime from 'mime'; import * as urljoin from 'url-join'; import { validatePublisher, validateExtensionName, validateVersion } from './validation'; +import {getDependencyFiles} from './npmdeps'; interface IReadFile { (filePath: string): Promise; @@ -304,17 +305,12 @@ const defaultIgnore = [ '**/*.vsixmanifest' ]; -function devDependenciesIgnore(manifest: Manifest): string[] { - const devDependencies = Object.keys(manifest.devDependencies || {}); - return devDependencies.map(d => `node_modules/${ d }/**`); -} - function collectFiles(cwd: string, manifest: Manifest): Promise { - return glob('**', { cwd, nodir: true, dot: true }).then(files => { + return getDependencyFiles(cwd) + .then(files => { return readFile(path.join(cwd, '.vscodeignore'), 'utf8') .catch(err => err.code !== 'ENOENT' ? Promise.reject(err) : Promise.resolve('')) .then(rawIgnore => rawIgnore.split(/[\n\r]/).map(s => s.trim()).filter(s => !!s)) - .then(ignore => devDependenciesIgnore(manifest).concat(ignore)) .then(ignore => defaultIgnore.concat(ignore)) .then(ignore => ignore.filter(i => !/^\s*#/.test(i))) .then<{ ignore: string[]; negate: string[]; }>(ignore => _.indexBy(_.partition(ignore, i => !/^\s*!/.test(i)), (o, i) => i ? 'negate' : 'ignore')) From 13284227d912a2a988672a74b185d2dbc934209b Mon Sep 17 00:00:00 2001 From: SrTobi Date: Fri, 18 Dec 2015 23:26:16 +0100 Subject: [PATCH 3/3] fixed devDependency test packages --- .../fixtures/devDependencies/node_modules/fake/package.json | 4 ++++ .../fixtures/devDependencies/node_modules/real/package.json | 4 ++++ src/test/fixtures/devDependencies/package.json | 2 +- src/test/package.test.ts | 3 +-- 4 files changed, 10 insertions(+), 3 deletions(-) create mode 100644 src/test/fixtures/devDependencies/node_modules/fake/package.json create mode 100644 src/test/fixtures/devDependencies/node_modules/real/package.json diff --git a/src/test/fixtures/devDependencies/node_modules/fake/package.json b/src/test/fixtures/devDependencies/node_modules/fake/package.json new file mode 100644 index 0000000..62d5790 --- /dev/null +++ b/src/test/fixtures/devDependencies/node_modules/fake/package.json @@ -0,0 +1,4 @@ +{ + "name": "fake", + "version": "1.0.0" +} \ No newline at end of file diff --git a/src/test/fixtures/devDependencies/node_modules/real/package.json b/src/test/fixtures/devDependencies/node_modules/real/package.json new file mode 100644 index 0000000..6f41add --- /dev/null +++ b/src/test/fixtures/devDependencies/node_modules/real/package.json @@ -0,0 +1,4 @@ +{ + "name": "real", + "version": "1.0.0" +} \ No newline at end of file diff --git a/src/test/fixtures/devDependencies/package.json b/src/test/fixtures/devDependencies/package.json index 48bf921..c8b9072 100644 --- a/src/test/fixtures/devDependencies/package.json +++ b/src/test/fixtures/devDependencies/package.json @@ -1,5 +1,5 @@ { - "name": "uuid", + "name": "root-test-package", "publisher": "joaomoreno", "version": "1.0.0", "engines": { "vscode": "*" }, diff --git a/src/test/package.test.ts b/src/test/package.test.ts index 0425ca1..ff27be4 100644 --- a/src/test/package.test.ts +++ b/src/test/package.test.ts @@ -58,11 +58,10 @@ describe('collect', () => { it('should ignore devDependencies', () => { const cwd = fixture('devDependencies'); - return readManifest(cwd) .then(manifest => collect(manifest, { cwd })) .then(files => { - assert.equal(files.length, 4); + assert.equal(files.length, 5); assert.ok(files.some(f => /real\/dependency\.js/.test(f.path))); assert.ok(!files.some(f => /fake\/dependency\.js/.test(f.path))); });