Skip to content

Commit 3085cb1

Browse files
authored
Ensure none of the npm packages rely on native dependencies (microsoft#1655)
* Check native depedencies during build and pre-commit * Ensure none of the npm packages use native dependencies
1 parent a4374fe commit 3085cb1

4 files changed

Lines changed: 58 additions & 2 deletions

File tree

‎gulpfile.js‎

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,8 @@ const istanbul = require('istanbul');
2626
const glob = require('glob');
2727
const os = require('os');
2828
const _ = require('lodash');
29+
const nativeDependencyChecker = require('node-has-native-dependencies');
30+
const flat = require('flat');
2931

3032
/**
3133
* Hygiene works by creating cascading subsets of all our files and
@@ -97,6 +99,12 @@ gulp.task('cover:clean', () => del(['coverage', 'debug_coverage*']));
9799

98100
gulp.task('clean:ptvsd', () => del(['coverage', 'pythonFiles/experimental/ptvsd*']));
99101

102+
gulp.task('checkNativeDependencies', () => {
103+
if (hasNativeDependencies()) {
104+
throw new Error('Native dependencies deteced');
105+
}
106+
});
107+
100108
gulp.task('cover:enable', () => {
101109
return gulp.src("./coverconfig.json")
102110
.pipe(jeditor((json) => {
@@ -115,6 +123,23 @@ gulp.task('cover:disable', () => {
115123
.pipe(gulp.dest("./out", { 'overwrite': true }));
116124
});
117125

126+
function hasNativeDependencies() {
127+
let nativeDependencies = nativeDependencyChecker.check(path.join(__dirname, 'node_modules'));
128+
if (!Array.isArray(nativeDependencies) || nativeDependencies.length === 0) {
129+
return false;
130+
}
131+
const dependencies = JSON.parse(cp.spawnSync('npm', ['ls', '--json', '--prod']).stdout.toString());
132+
const jsonProperties = Object.keys(flat.flatten(dependencies));
133+
nativeDependencies = _.flatMap(nativeDependencies, item => path.dirname(item.substring(item.indexOf('node_modules') + 'node_modules'.length)).split(path.sep))
134+
.filter(item => item.length > 0)
135+
.filter(item => jsonProperties.findIndex(flattenedDependency => flattenedDependency.endsWith(`dependencies.${item}.version`)) >= 0);
136+
if (nativeDependencies.length > 0) {
137+
console.error('Native dependencies detected', nativeDependencies);
138+
return true;
139+
}
140+
return false;
141+
}
142+
118143
function buildDebugAdapterCoverage() {
119144
const matches = glob.sync(path.join(__dirname, 'debug_coverage*/coverage.json'));
120145
matches.forEach(coverageFile => {

‎news/3 Code Health/1416.md‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Ensure none of the npm packages (used by the extension) rely on native dependencies.

‎package.json‎

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1847,7 +1847,7 @@
18471847
]
18481848
},
18491849
"scripts": {
1850-
"vscode:prepublish": "tsc -p ./",
1850+
"vscode:prepublish": "gulp checkNativeDependencies && tsc -p ./",
18511851
"compile": "tsc -watch -p ./",
18521852
"postinstall": "node ./node_modules/vscode/bin/install",
18531853
"test": "node ./out/test/standardTest.js && node ./out/test/multiRootTest.js",
@@ -1930,6 +1930,7 @@
19301930
"decache": "^4.4.0",
19311931
"del": "^3.0.0",
19321932
"event-stream": "^3.3.4",
1933+
"flat": "^4.0.0",
19331934
"gulp": "^3.9.1",
19341935
"gulp-debounced-watch": "^1.0.4",
19351936
"gulp-filter": "^5.1.0",
@@ -1942,6 +1943,7 @@
19421943
"is-running": "^2.1.0",
19431944
"istanbul": "^0.4.5",
19441945
"mocha": "^5.0.4",
1946+
"node-has-native-dependencies": "^1.0.2",
19451947
"relative": "^3.0.2",
19461948
"remap-istanbul": "^0.10.1",
19471949
"retyped-diff-match-patch-tsd-ambient": "^1.0.0-0",

‎yarn.lock‎

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -388,6 +388,12 @@ async-each@^1.0.0:
388388
version "1.0.1"
389389
resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.1.tgz#19d386a1d9edc6e7c1c85d388aedbcc56d33602d"
390390

391+
async@*:
392+
version "2.6.0"
393+
resolved "https://registry.yarnpkg.com/async/-/async-2.6.0.tgz#61a29abb6fcc026fea77e56d1c6ec53a795951f4"
394+
dependencies:
395+
lodash "^4.14.0"
396+
391397
async@1.x, async@^1.4.0:
392398
version "1.5.2"
393399
resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a"
@@ -1381,6 +1387,12 @@ flagged-respawn@^1.0.0:
13811387
version "1.0.0"
13821388
resolved "https://registry.yarnpkg.com/flagged-respawn/-/flagged-respawn-1.0.0.tgz#4e79ae9b2eb38bf86b3bb56bf3e0a56aa5fcabd7"
13831389

1390+
flat@^4.0.0:
1391+
version "4.0.0"
1392+
resolved "https://registry.yarnpkg.com/flat/-/flat-4.0.0.tgz#3abc7f3b588e64ce77dc42fd59aa35806622fea8"
1393+
dependencies:
1394+
is-buffer "~1.1.5"
1395+
13841396
flush-write-stream@^1.0.2:
13851397
version "1.0.2"
13861398
resolved "https://registry.yarnpkg.com/flush-write-stream/-/flush-write-stream-1.0.2.tgz#c81b90d8746766f1a609a46809946c45dd8ae417"
@@ -1453,6 +1465,12 @@ fs-mkdirp-stream@^1.0.0:
14531465
graceful-fs "^4.1.11"
14541466
through2 "^2.0.3"
14551467

1468+
fs-walk@0.0.1:
1469+
version "0.0.1"
1470+
resolved "https://registry.yarnpkg.com/fs-walk/-/fs-walk-0.0.1.tgz#f7fc91c3ae1eead07c998bc5d0dd41f2dbebd335"
1471+
dependencies:
1472+
async "*"
1473+
14561474
fs.realpath@^1.0.0:
14571475
version "1.0.0"
14581476
resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f"
@@ -2173,7 +2191,7 @@ is-binary-path@^1.0.0:
21732191
dependencies:
21742192
binary-extensions "^1.0.0"
21752193

2176-
is-buffer@^1.1.5, is-buffer@~1.1.1:
2194+
is-buffer@^1.1.5, is-buffer@~1.1.1, is-buffer@~1.1.5:
21772195
version "1.1.6"
21782196
resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be"
21792197

@@ -2851,6 +2869,10 @@ lodash@4.17.5, lodash@^4.17.4:
28512869
version "4.17.5"
28522870
resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.5.tgz#99a92d65c0272debe8c96b6057bc8fbfa3bed511"
28532871

2872+
lodash@^4.14.0:
2873+
version "4.17.10"
2874+
resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.10.tgz#1b7793cf7259ea38fb3661d4d38b3260af8ae4e7"
2875+
28542876
lodash@~1.0.1:
28552877
version "1.0.2"
28562878
resolved "https://registry.yarnpkg.com/lodash/-/lodash-1.0.2.tgz#8f57560c83b59fc270bd3d561b690043430e2551"
@@ -3152,6 +3174,12 @@ nise@^1.2.0:
31523174
path-to-regexp "^1.7.0"
31533175
text-encoding "^0.6.4"
31543176

3177+
node-has-native-dependencies@^1.0.2:
3178+
version "1.0.2"
3179+
resolved "https://registry.yarnpkg.com/node-has-native-dependencies/-/node-has-native-dependencies-1.0.2.tgz#3152ec9753b6641e4d322d185dd4930649ada3da"
3180+
dependencies:
3181+
fs-walk "0.0.1"
3182+
31553183
node-pre-gyp@^0.6.39:
31563184
version "0.6.39"
31573185
resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.6.39.tgz#c00e96860b23c0e1420ac7befc5044e1d78d8649"

0 commit comments

Comments
 (0)