From c6ceb1ab2ea7733da3f787ec642aeeb008a59700 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Moreno?= Date: Thu, 7 Jan 2021 09:15:05 +0100 Subject: [PATCH] isolate eslint from hygiene --- build/eslint.js | 36 ++++++++ build/filters.js | 151 ++++++++++++++++++++++++++++++ build/gulpfile.hygiene.js | 27 +----- build/hygiene.js | 188 +++++--------------------------------- package.json | 2 +- 5 files changed, 214 insertions(+), 190 deletions(-) create mode 100644 build/eslint.js create mode 100644 build/filters.js diff --git a/build/eslint.js b/build/eslint.js new file mode 100644 index 00000000000..3e3fdf19678 --- /dev/null +++ b/build/eslint.js @@ -0,0 +1,36 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +const es = require('event-stream'); +const vfs = require('vinyl-fs'); +const { jsHygieneFilter, tsHygieneFilter } = require('./filters'); + +function eslint() { + const gulpeslint = require('gulp-eslint'); + return vfs + .src([...jsHygieneFilter, ...tsHygieneFilter], { base: '.', follow: true, allowEmpty: true }) + .pipe( + gulpeslint({ + configFile: '.eslintrc.json', + rulePaths: ['./build/lib/eslint'], + }) + ) + .pipe(gulpeslint.formatEach('compact')) + .pipe( + gulpeslint.results((results) => { + if (results.warningCount > 0 || results.errorCount > 0) { + throw new Error('eslint failed with warnings and/or errors'); + } + }) + ).pipe(es.through(function () { /* noop, important for the stream to end */ })); +} + +if (require.main === module) { + eslint().on('error', (err) => { + console.error(); + console.error(err); + process.exit(1); + }); +} diff --git a/build/filters.js b/build/filters.js new file mode 100644 index 00000000000..addaebe96f1 --- /dev/null +++ b/build/filters.js @@ -0,0 +1,151 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +/** + * Hygiene works by creating cascading subsets of all our files and + * passing them through a sequence of checks. Here are the current subsets, + * named according to the checks performed on them. Each subset contains + * the following one, as described in mathematical notation: + * + * all ⊃ eol ⊇ indentation ⊃ copyright ⊃ typescript + */ + +module.exports.all = [ + '*', + 'build/**/*', + 'extensions/**/*', + 'scripts/**/*', + 'src/**/*', + 'test/**/*', + '!out*/**', + '!test/**/out/**', + '!**/node_modules/**', +]; + +module.exports.indentationFilter = [ + '**', + + // except specific files + '!**/ThirdPartyNotices.txt', + '!**/LICENSE.{txt,rtf}', + '!LICENSES.chromium.html', + '!**/LICENSE', + '!src/vs/nls.js', + '!src/vs/nls.build.js', + '!src/vs/css.js', + '!src/vs/css.build.js', + '!src/vs/loader.js', + '!src/vs/base/common/insane/insane.js', + '!src/vs/base/common/marked/marked.js', + '!src/vs/base/common/semver/semver.js', + '!src/vs/base/node/terminateProcess.sh', + '!src/vs/base/node/cpuUsage.sh', + '!test/unit/assert.js', + '!resources/linux/snap/electron-launch', + + // except specific folders + '!test/automation/out/**', + '!test/monaco/out/**', + '!test/smoke/out/**', + '!extensions/typescript-language-features/test-workspace/**', + '!extensions/vscode-api-tests/testWorkspace/**', + '!extensions/vscode-api-tests/testWorkspace2/**', + '!build/monaco/**', + '!build/win32/**', + + // except multiple specific files + '!**/package.json', + '!**/yarn.lock', + '!**/yarn-error.log', + + // except multiple specific folders + '!**/codicon/**', + '!**/fixtures/**', + '!**/lib/**', + '!extensions/**/dist/**', + '!extensions/**/out/**', + '!extensions/**/snippets/**', + '!extensions/**/syntaxes/**', + '!extensions/**/themes/**', + '!extensions/**/colorize-fixtures/**', + + // except specific file types + '!src/vs/*/**/*.d.ts', + '!src/typings/**/*.d.ts', + '!extensions/**/*.d.ts', + '!**/*.{svg,exe,png,bmp,jpg,scpt,bat,cmd,cur,ttf,woff,eot,md,ps1,template,yaml,yml,d.ts.recipe,ico,icns,plist}', + '!build/{lib,download,darwin}/**/*.js', + '!build/**/*.sh', + '!build/azure-pipelines/**/*.js', + '!build/azure-pipelines/**/*.config', + '!**/Dockerfile', + '!**/Dockerfile.*', + '!**/*.Dockerfile', + '!**/*.dockerfile', + '!extensions/markdown-language-features/media/*.js', + '!extensions/simple-browser/media/*.js', +]; + +module.exports.copyrightFilter = [ + '**', + '!**/*.desktop', + '!**/*.json', + '!**/*.html', + '!**/*.template', + '!**/*.md', + '!**/*.bat', + '!**/*.cmd', + '!**/*.ico', + '!**/*.icns', + '!**/*.xml', + '!**/*.sh', + '!**/*.txt', + '!**/*.xpm', + '!**/*.opts', + '!**/*.disabled', + '!**/*.code-workspace', + '!**/*.js.map', + '!build/**/*.init', + '!resources/linux/snap/snapcraft.yaml', + '!resources/win32/bin/code.js', + '!resources/web/code-web.js', + '!resources/completions/**', + '!extensions/configuration-editing/build/inline-allOf.ts', + '!extensions/markdown-language-features/media/highlight.css', + '!extensions/html-language-features/server/src/modes/typescript/*', + '!extensions/*/server/bin/*', + '!src/vs/editor/test/node/classification/typescript-test.ts', +]; + +module.exports.jsHygieneFilter = [ + 'src/**/*.js', + 'build/gulpfile.*.js', + '!src/vs/loader.js', + '!src/vs/css.js', + '!src/vs/nls.js', + '!src/vs/css.build.js', + '!src/vs/nls.build.js', + '!src/**/insane.js', + '!src/**/marked.js', + '!src/**/semver.js', + '!**/test/**', +]; + +module.exports.tsHygieneFilter = [ + 'src/**/*.ts', + 'test/**/*.ts', + 'extensions/**/*.ts', + '!src/vs/*/**/*.d.ts', + '!src/typings/**/*.d.ts', + '!extensions/**/*.d.ts', + '!**/fixtures/**', + '!**/typings/**', + '!**/node_modules/**', + '!extensions/typescript-basics/test/colorize-fixtures/**', + '!extensions/vscode-api-tests/testWorkspace/**', + '!extensions/vscode-api-tests/testWorkspace2/**', + '!extensions/**/*.test.ts', + '!extensions/html-language-features/server/lib/jquery.d.ts', +]; diff --git a/build/gulpfile.hygiene.js b/build/gulpfile.hygiene.js index cc0a79d9d6b..838fc661eb5 100644 --- a/build/gulpfile.hygiene.js +++ b/build/gulpfile.hygiene.js @@ -4,33 +4,10 @@ *--------------------------------------------------------------------------------------------*/ const gulp = require('gulp'); -const filter = require('gulp-filter'); const es = require('event-stream'); -const vfs = require('vinyl-fs'); const path = require('path'); const task = require('./lib/task'); -const { all, jsHygieneFilter, tsHygieneFilter, hygiene } = require('./hygiene'); - -gulp.task('eslint', () => { - const gulpeslint = require('gulp-eslint'); - return vfs - .src(all, { base: '.', follow: true, allowEmpty: true }) - .pipe(filter(jsHygieneFilter.concat(tsHygieneFilter))) - .pipe( - gulpeslint({ - configFile: '.eslintrc.json', - rulePaths: ['./build/lib/eslint'], - }) - ) - .pipe(gulpeslint.formatEach('compact')) - .pipe( - gulpeslint.results((results) => { - if (results.warningCount > 0 || results.errorCount > 0) { - throw new Error('eslint failed with warnings and/or errors'); - } - }) - ); -}); +const { hygiene } = require('./hygiene'); function checkPackageJSON(actualPath) { const actual = require(path.join(__dirname, '..', actualPath)); @@ -67,5 +44,5 @@ const checkPackageJSONTask = task.define('check-package-json', () => { }); gulp.task(checkPackageJSONTask); -const hygieneTask = task.define('hygiene', task.series(checkPackageJSONTask, () => hygiene())); +const hygieneTask = task.define('hygiene', task.series(checkPackageJSONTask, () => hygiene(undefined, false))); gulp.task(hygieneTask); diff --git a/build/hygiene.js b/build/hygiene.js index 63113424f88..432cef1f39f 100644 --- a/build/hygiene.js +++ b/build/hygiene.js @@ -10,153 +10,7 @@ const vfs = require('vinyl-fs'); const path = require('path'); const fs = require('fs'); const pall = require('p-all'); - -/** - * Hygiene works by creating cascading subsets of all our files and - * passing them through a sequence of checks. Here are the current subsets, - * named according to the checks performed on them. Each subset contains - * the following one, as described in mathematical notation: - * - * all ⊃ eol ⊇ indentation ⊃ copyright ⊃ typescript - */ - -const all = [ - '*', - 'build/**/*', - 'extensions/**/*', - 'scripts/**/*', - 'src/**/*', - 'test/**/*', - '!out*/**', - '!test/**/out/**', - '!**/node_modules/**', -]; -module.exports.all = all; - -const indentationFilter = [ - '**', - - // except specific files - '!**/ThirdPartyNotices.txt', - '!**/LICENSE.{txt,rtf}', - '!LICENSES.chromium.html', - '!**/LICENSE', - '!src/vs/nls.js', - '!src/vs/nls.build.js', - '!src/vs/css.js', - '!src/vs/css.build.js', - '!src/vs/loader.js', - '!src/vs/base/common/insane/insane.js', - '!src/vs/base/common/marked/marked.js', - '!src/vs/base/common/semver/semver.js', - '!src/vs/base/node/terminateProcess.sh', - '!src/vs/base/node/cpuUsage.sh', - '!test/unit/assert.js', - '!resources/linux/snap/electron-launch', - - // except specific folders - '!test/automation/out/**', - '!test/monaco/out/**', - '!test/smoke/out/**', - '!extensions/typescript-language-features/test-workspace/**', - '!extensions/vscode-api-tests/testWorkspace/**', - '!extensions/vscode-api-tests/testWorkspace2/**', - '!build/monaco/**', - '!build/win32/**', - - // except multiple specific files - '!**/package.json', - '!**/yarn.lock', - '!**/yarn-error.log', - - // except multiple specific folders - '!**/codicon/**', - '!**/fixtures/**', - '!**/lib/**', - '!extensions/**/dist/**', - '!extensions/**/out/**', - '!extensions/**/snippets/**', - '!extensions/**/syntaxes/**', - '!extensions/**/themes/**', - '!extensions/**/colorize-fixtures/**', - - // except specific file types - '!src/vs/*/**/*.d.ts', - '!src/typings/**/*.d.ts', - '!extensions/**/*.d.ts', - '!**/*.{svg,exe,png,bmp,jpg,scpt,bat,cmd,cur,ttf,woff,eot,md,ps1,template,yaml,yml,d.ts.recipe,ico,icns,plist}', - '!build/{lib,download,darwin}/**/*.js', - '!build/**/*.sh', - '!build/azure-pipelines/**/*.js', - '!build/azure-pipelines/**/*.config', - '!**/Dockerfile', - '!**/Dockerfile.*', - '!**/*.Dockerfile', - '!**/*.dockerfile', - '!extensions/markdown-language-features/media/*.js', - '!extensions/simple-browser/media/*.js', -]; - -const copyrightFilter = [ - '**', - '!**/*.desktop', - '!**/*.json', - '!**/*.html', - '!**/*.template', - '!**/*.md', - '!**/*.bat', - '!**/*.cmd', - '!**/*.ico', - '!**/*.icns', - '!**/*.xml', - '!**/*.sh', - '!**/*.txt', - '!**/*.xpm', - '!**/*.opts', - '!**/*.disabled', - '!**/*.code-workspace', - '!**/*.js.map', - '!build/**/*.init', - '!resources/linux/snap/snapcraft.yaml', - '!resources/win32/bin/code.js', - '!resources/web/code-web.js', - '!resources/completions/**', - '!extensions/configuration-editing/build/inline-allOf.ts', - '!extensions/markdown-language-features/media/highlight.css', - '!extensions/html-language-features/server/src/modes/typescript/*', - '!extensions/*/server/bin/*', - '!src/vs/editor/test/node/classification/typescript-test.ts', -]; - -const jsHygieneFilter = [ - 'src/**/*.js', - 'build/gulpfile.*.js', - '!src/vs/loader.js', - '!src/vs/css.js', - '!src/vs/nls.js', - '!src/vs/css.build.js', - '!src/vs/nls.build.js', - '!src/**/insane.js', - '!src/**/marked.js', - '!src/**/semver.js', - '!**/test/**', -]; -module.exports.jsHygieneFilter = jsHygieneFilter; - -const tsHygieneFilter = [ - 'src/**/*.ts', - 'test/**/*.ts', - 'extensions/**/*.ts', - '!**/fixtures/**', - '!**/typings/**', - '!**/node_modules/**', - '!extensions/typescript-basics/test/colorize-fixtures/**', - '!extensions/vscode-api-tests/testWorkspace/**', - '!extensions/vscode-api-tests/testWorkspace2/**', - '!extensions/**/*.test.ts', - '!extensions/html-language-features/server/lib/jquery.d.ts', -]; -module.exports.tsHygieneFilter = tsHygieneFilter; +const { all, copyrightFilter, indentationFilter, jsHygieneFilter, tsHygieneFilter } = require('./filters'); const copyrightHeaderLines = [ '/*---------------------------------------------------------------------------------------------', @@ -165,7 +19,7 @@ const copyrightHeaderLines = [ ' *--------------------------------------------------------------------------------------------*/', ]; -function hygiene(some) { +function hygiene(some, linting = true) { const gulpeslint = require('gulp-eslint'); const tsfmt = require('typescript-formatter'); @@ -278,26 +132,32 @@ function hygiene(some) { .pipe(filter(copyrightFilter)) .pipe(copyrights); - const typescript = result.pipe(filter(tsHygieneFilter)).pipe(formatting); + const streams = [ + result.pipe(filter(tsHygieneFilter)).pipe(formatting) + ]; - const javascript = result - .pipe(filter(jsHygieneFilter.concat(tsHygieneFilter))) - .pipe( - gulpeslint({ - configFile: '.eslintrc.json', - rulePaths: ['./build/lib/eslint'], - }) - ) - .pipe(gulpeslint.formatEach('compact')) - .pipe( - gulpeslint.results((results) => { - errorCount += results.warningCount; - errorCount += results.errorCount; - }) + if (linting) { + streams.push( + result + .pipe(filter([...jsHygieneFilter, ...tsHygieneFilter])) + .pipe( + gulpeslint({ + configFile: '.eslintrc.json', + rulePaths: ['./build/lib/eslint'], + }) + ) + .pipe(gulpeslint.formatEach('compact')) + .pipe( + gulpeslint.results((results) => { + errorCount += results.warningCount; + errorCount += results.errorCount; + }) + ) ); + } let count = 0; - return es.merge(typescript, javascript).pipe( + return es.merge(...streams).pipe( es.through( function (data) { count++; diff --git a/package.json b/package.json index d0cd2ffbc43..ff47b90f717 100644 --- a/package.json +++ b/package.json @@ -44,7 +44,7 @@ "web": "node resources/web/code-web.js", "compile-web": "node --max_old_space_size=4095 ./node_modules/gulp/bin/gulp.js compile-web", "watch-web": "node --max_old_space_size=4095 ./node_modules/gulp/bin/gulp.js watch-web", - "eslint": "eslint -c .eslintrc.json --rulesdir ./build/lib/eslint --ext .ts --ext .js ./src/vs ./extensions", + "eslint": "node build/eslint", "electron-rebuild": "electron-rebuild --arch=arm64 --force --version=11.1.0", "playwright-install": "node node_modules/playwright/install.js", "compile-build": "node --max_old_space_size=4095 ./node_modules/gulp/bin/gulp.js compile-build",