From 7449d86b89c7335a2e99c53cd65a58c24ba89da3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Moreno?= Date: Tue, 5 Jan 2021 11:54:18 +0100 Subject: [PATCH] use esbuild for minification --- build/lib/optimize.js | 73 ++++++++++++++++++---------------------- build/lib/optimize.ts | 78 +++++++++++++++++++------------------------ build/package.json | 5 +-- build/yarn.lock | 51 +--------------------------- package.json | 5 ++- yarn.lock | 63 ++++++++++++++++------------------ 6 files changed, 101 insertions(+), 174 deletions(-) diff --git a/build/lib/optimize.js b/build/lib/optimize.js index 275fcc45a19..1f3cc8f1be0 100644 --- a/build/lib/optimize.js +++ b/build/lib/optimize.js @@ -162,47 +162,46 @@ function optimizeTask(opts) { }; } exports.optimizeTask = optimizeTask; +// declare class FileWithCopyright extends VinylFile { +// public __hasOurCopyright: boolean; +// } /** * Wrap around uglify and allow the preserveComments function * to have a file "context" to include our copyright only once per file. */ function uglifyWithCopyrights() { - const composer = require('gulp-uglify/composer'); - const terser = require('terser'); - const preserveComments = (f) => { - return (_node, comment) => { - const text = comment.value; - const type = comment.type; - if (/@minifier_do_not_preserve/.test(text)) { - return false; - } - const isOurCopyright = IS_OUR_COPYRIGHT_REGEXP.test(text); - if (isOurCopyright) { - if (f.__hasOurCopyright) { - return false; - } - f.__hasOurCopyright = true; - return true; - } - if ('comment2' === type) { - // check for /*!. Note that text doesn't contain leading /* - return (text.length > 0 && text[0] === '!') || /@preserve|license|@cc_on|copyright/i.test(text); - } - else if ('comment1' === type) { - return /license|copyright/i.test(text); - } - return false; - }; - }; - const minify = composer(terser); + const esbuild = require('gulp-esbuild'); + // const preserveComments = (f: FileWithCopyright) => { + // return (_node: any, comment: { value: string; type: string; }) => { + // const text = comment.value; + // const type = comment.type; + // if (/@minifier_do_not_preserve/.test(text)) { + // return false; + // } + // const isOurCopyright = IS_OUR_COPYRIGHT_REGEXP.test(text); + // if (isOurCopyright) { + // if (f.__hasOurCopyright) { + // return false; + // } + // f.__hasOurCopyright = true; + // return true; + // } + // if ('comment2' === type) { + // // check for /*!. Note that text doesn't contain leading /* + // return (text.length > 0 && text[0] === '!') || /@preserve|license|@cc_on|copyright/i.test(text); + // } else if ('comment1' === type) { + // return /license|copyright/i.test(text); + // } + // return false; + // }; + // }; const input = es.through(); const output = input .pipe(flatmap((stream, f) => { - return stream.pipe(minify({ - output: { - comments: preserveComments(f), - max_line_len: 1024 - } + return stream.pipe(esbuild({ + outfile: f.relative, + sourcemap: true, + minify: true, })); })); return es.duplex(input, output); @@ -211,7 +210,6 @@ function minifyTask(src, sourceMapBaseUrl) { const sourceMappingURL = sourceMapBaseUrl ? ((f) => `${sourceMapBaseUrl}/${f.relative}.map`) : undefined; return cb => { const minifyCSS = require('gulp-cssnano'); - const uglify = require('gulp-uglify'); const sourcemaps = require('gulp-sourcemaps'); const jsFilter = filter('**/*.js', { restore: true }); const cssFilter = filter('**/*.css', { restore: true }); @@ -225,12 +223,7 @@ function minifyTask(src, sourceMapBaseUrl) { sourceRoot: undefined, includeContent: true, addComment: true - }), gulp.dest(src + '-min'), (err) => { - if (err instanceof uglify.GulpUglifyError) { - console.error(`Uglify error in '${err.cause && err.cause.filename}'`); - } - cb(err); - }); + }), gulp.dest(src + '-min'), (err) => cb(err)); }; } exports.minifyTask = minifyTask; diff --git a/build/lib/optimize.ts b/build/lib/optimize.ts index 897b4b558eb..8f30e886e98 100644 --- a/build/lib/optimize.ts +++ b/build/lib/optimize.ts @@ -232,55 +232,52 @@ export function optimizeTask(opts: IOptimizeTaskOpts): () => NodeJS.ReadWriteStr }; } -declare class FileWithCopyright extends VinylFile { - public __hasOurCopyright: boolean; -} +// declare class FileWithCopyright extends VinylFile { +// public __hasOurCopyright: boolean; +// } /** * Wrap around uglify and allow the preserveComments function * to have a file "context" to include our copyright only once per file. */ function uglifyWithCopyrights(): NodeJS.ReadWriteStream { - const composer = require('gulp-uglify/composer') as typeof import('gulp-uglify/composer'); - const terser = require('terser') as typeof import('terser'); + const esbuild = require('gulp-esbuild') as typeof import('gulp-esbuild'); - const preserveComments = (f: FileWithCopyright) => { - return (_node: any, comment: { value: string; type: string; }) => { - const text = comment.value; - const type = comment.type; + // const preserveComments = (f: FileWithCopyright) => { + // return (_node: any, comment: { value: string; type: string; }) => { + // const text = comment.value; + // const type = comment.type; - if (/@minifier_do_not_preserve/.test(text)) { - return false; - } + // if (/@minifier_do_not_preserve/.test(text)) { + // return false; + // } - const isOurCopyright = IS_OUR_COPYRIGHT_REGEXP.test(text); + // const isOurCopyright = IS_OUR_COPYRIGHT_REGEXP.test(text); - if (isOurCopyright) { - if (f.__hasOurCopyright) { - return false; - } - f.__hasOurCopyright = true; - return true; - } + // if (isOurCopyright) { + // if (f.__hasOurCopyright) { + // return false; + // } + // f.__hasOurCopyright = true; + // return true; + // } - if ('comment2' === type) { - // check for /*!. Note that text doesn't contain leading /* - return (text.length > 0 && text[0] === '!') || /@preserve|license|@cc_on|copyright/i.test(text); - } else if ('comment1' === type) { - return /license|copyright/i.test(text); - } - return false; - }; - }; + // if ('comment2' === type) { + // // check for /*!. Note that text doesn't contain leading /* + // return (text.length > 0 && text[0] === '!') || /@preserve|license|@cc_on|copyright/i.test(text); + // } else if ('comment1' === type) { + // return /license|copyright/i.test(text); + // } + // return false; + // }; + // }; - const minify = (composer as any)(terser); const input = es.through(); const output = input .pipe(flatmap((stream, f) => { - return stream.pipe(minify({ - output: { - comments: preserveComments(f), - max_line_len: 1024 - } + return stream.pipe(esbuild({ + outfile: f.relative, + sourcemap: true, + minify: true, })); })); @@ -292,7 +289,6 @@ export function minifyTask(src: string, sourceMapBaseUrl?: string): (cb: any) => return cb => { const minifyCSS = require('gulp-cssnano') as typeof import('gulp-cssnano'); - const uglify = require('gulp-uglify') as typeof import('gulp-uglify'); const sourcemaps = require('gulp-sourcemaps') as typeof import('gulp-sourcemaps'); const jsFilter = filter('**/*.js', { restore: true }); @@ -320,13 +316,7 @@ export function minifyTask(src: string, sourceMapBaseUrl?: string): (cb: any) => includeContent: true, addComment: true } as any), - gulp.dest(src + '-min') - , (err: any) => { - if (err instanceof (uglify as any).GulpUglifyError) { - console.error(`Uglify error in '${err.cause && err.cause.filename}'`); - } - - cb(err); - }); + gulp.dest(src + '-min'), + (err: any) => cb(err)); }; } diff --git a/build/package.json b/build/package.json index cbd01eccce1..091f8b77940 100644 --- a/build/package.json +++ b/build/package.json @@ -17,7 +17,6 @@ "@types/gulp-json-editor": "^2.2.31", "@types/gulp-rename": "^0.0.33", "@types/gulp-sourcemaps": "^0.0.32", - "@types/gulp-uglify": "^3.0.5", "@types/mime": "0.0.29", "@types/minimatch": "^3.0.3", "@types/minimist": "^1.2.1", @@ -26,7 +25,6 @@ "@types/pump": "^1.0.1", "@types/request": "^2.47.0", "@types/rimraf": "^2.0.4", - "@types/terser": "^3.12.0", "@types/through": "^0.0.29", "@types/through2": "^2.0.34", "@types/underscore": "^1.8.9", @@ -47,5 +45,8 @@ "watch": "tsc -p tsconfig.build.json --watch", "postinstall": "npm run compile", "npmCheckJs": "tsc --noEmit" + }, + "dependencies": { + "source-map": "0.6.1" } } diff --git a/build/yarn.lock b/build/yarn.lock index 71332dd8449..326c464c412 100644 --- a/build/yarn.lock +++ b/build/yarn.lock @@ -151,14 +151,6 @@ dependencies: "@types/node" "*" -"@types/gulp-uglify@^3.0.5": - version "3.0.5" - resolved "https://registry.yarnpkg.com/@types/gulp-uglify/-/gulp-uglify-3.0.5.tgz#ddcbbb6bd15a84b8a6c5e2218c2efba98102d135" - integrity sha512-LD2b6gCPugrKI1W188nIp0gm+cAnGGwaTFpPdeZYVXwPHdoCQloy3du0JR62MeMjAwUwlcOb+SKYT6Qgw7yBiA== - dependencies: - "@types/node" "*" - "@types/uglify-js" "^2" - "@types/gulp@^4.0.5": version "4.0.5" resolved "https://registry.yarnpkg.com/@types/gulp/-/gulp-4.0.5.tgz#f5f498d5bf9538364792de22490a12c0e6bc5eb4" @@ -233,13 +225,6 @@ "@types/glob" "*" "@types/node" "*" -"@types/terser@^3.12.0": - version "3.12.0" - resolved "https://registry.yarnpkg.com/@types/terser/-/terser-3.12.0.tgz#25e020fe9a7a6ae92ce46261f00ced67de6c12ac" - integrity sha512-J0Wy8A7ULEqVJftkWhrXZbH0iBk4tYuTj0gBiiveKaY9deNi6cCsxl0ApJ27ojqwYv51bvEw85lOb8Wt4ng9zA== - dependencies: - terser "*" - "@types/through2@^2.0.34": version "2.0.34" resolved "https://registry.yarnpkg.com/@types/through2/-/through2-2.0.34.tgz#9c2a259a238dace2a05a2f8e94b786961bc27ac4" @@ -259,13 +244,6 @@ resolved "https://registry.yarnpkg.com/@types/tough-cookie/-/tough-cookie-2.3.2.tgz#e0d481d8bb282ad8a8c9e100ceb72c995fb5e709" integrity sha512-vOVmaruQG5EatOU/jM6yU2uCp3Lz6mK1P5Ztu4iJjfM4SVHU9XYktPUQtKlIXuahqXHdEyUarMrBEwg5Cwu+bA== -"@types/uglify-js@^2": - version "2.6.31" - resolved "https://registry.yarnpkg.com/@types/uglify-js/-/uglify-js-2.6.31.tgz#c694755eeb6a1bb9f8f321f3ec37cc22ca4c4f6b" - integrity sha512-LjcyGt6CHsgZ0AoofnMwhyxo9hUqz2mgl6IcF+S8B1zdSTxHAvTO/1RPvBAHG3C1ZeAc+AoWA5mb3lDJKtM9Zg== - dependencies: - source-map "^0.6.1" - "@types/underscore@^1.8.9": version "1.8.9" resolved "https://registry.yarnpkg.com/@types/underscore/-/underscore-1.8.9.tgz#fef41f800cd23db1b4f262ddefe49cd952d82323" @@ -517,11 +495,6 @@ buffer-fill@^1.0.0: resolved "https://registry.yarnpkg.com/buffer-fill/-/buffer-fill-1.0.0.tgz#f8f78b76789888ef39f205cd637f68e702122b2c" integrity sha1-+PeLdniYiO858gXNY39o5wISKyw= -buffer-from@^1.0.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" - integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A== - caseless@~0.12.0: version "0.12.0" resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" @@ -551,11 +524,6 @@ combined-stream@^1.0.5, combined-stream@~1.0.5: dependencies: delayed-stream "~1.0.0" -commander@^2.20.0: - version "2.20.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.0.tgz#d58bb2b5c1ee8f87b0d340027e9e94e222c5a422" - integrity sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ== - commander@^2.8.1: version "2.19.0" resolved "https://registry.yarnpkg.com/commander/-/commander-2.19.0.tgz#f6198aa84e5b83c46054b94ddedbfed5ee9ff12a" @@ -1305,15 +1273,7 @@ sntp@1.x.x: dependencies: hoek "2.x.x" -source-map-support@~0.5.12: - version "0.5.13" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.13.tgz#31b24a9c2e73c2de85066c0feb7d44767ed52932" - integrity sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w== - dependencies: - buffer-from "^1.0.0" - source-map "^0.6.0" - -source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.1: +source-map@0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== @@ -1355,15 +1315,6 @@ stringstream@~0.0.4: resolved "https://registry.yarnpkg.com/stringstream/-/stringstream-0.0.5.tgz#4e484cd4de5a0bbbee18e46307710a8a81621878" integrity sha1-TkhM1N5aC7vuGORjB3EKioFiGHg= -terser@*: - version "4.2.1" - resolved "https://registry.yarnpkg.com/terser/-/terser-4.2.1.tgz#1052cfe17576c66e7bc70fcc7119f22b155bdac1" - integrity sha512-cGbc5utAcX4a9+2GGVX4DsenG6v0x3glnDi5hx8816X1McEAwPlPgRtXPJzSBsbpILxZ8MQMT0KvArLuE0HP5A== - dependencies: - commander "^2.20.0" - source-map "~0.6.1" - source-map-support "~0.5.12" - tmp@0.0.29: version "0.0.29" resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.29.tgz#f25125ff0dd9da3ccb0c2dd371ee1288bb9128c0" diff --git a/package.json b/package.json index c2f58aa5b5c..883ab90dc2e 100644 --- a/package.json +++ b/package.json @@ -135,6 +135,7 @@ "gulp-buffer": "0.0.2", "gulp-concat": "^2.6.1", "gulp-cssnano": "^2.1.3", + "gulp-esbuild": "^0.3.12", "gulp-eslint": "^5.0.0", "gulp-filter": "^5.1.0", "gulp-flatmap": "^1.0.2", @@ -148,7 +149,6 @@ "gulp-shell": "^0.6.5", "gulp-sourcemaps": "^1.11.0", "gulp-tsb": "4.0.5", - "gulp-uglify": "^3.0.0", "gulp-untar": "^0.0.7", "gulp-vinyl-zip": "^2.1.2", "husky": "^0.13.1", @@ -183,7 +183,6 @@ "source-map": "^0.4.4", "source-map-support": "^0.3.2", "style-loader": "^1.0.0", - "terser": "^4.8.0", "ts-loader": "^6.2.1", "tsec": "googleinterns/tsec#7bf4ab23686500522341b977b3e2cc04b1f720b1", "typescript": "4.2.0-dev.20201207", @@ -214,4 +213,4 @@ "windows-mutex": "0.3.0", "windows-process-tree": "0.2.4" } -} \ No newline at end of file +} diff --git a/yarn.lock b/yarn.lock index 19a1931a8ff..712616fbcbf 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3194,6 +3194,11 @@ es6-weak-map@^2.0.1: es6-iterator "^2.0.1" es6-symbol "^3.1.1" +esbuild@^0.8.29: + version "0.8.29" + resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.8.29.tgz#cc20fb752e0905a3546d68ae1be58f9b97044c39" + integrity sha512-UDsEoeXuctVgG2hEts1Hwq2jYDGqV7nksEHEZaiCy2v+lXF5ButX4ErPAJAFi5ZNKKW+6Pom93pArV7hki6HnQ== + escalade@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.0.2.tgz#6a580d70edb87880f22b4c91d0d56078df6962c4" @@ -4578,6 +4583,15 @@ gulp-cssnano@^2.1.3: plugin-error "^1.0.1" vinyl-sourcemaps-apply "^0.2.1" +gulp-esbuild@^0.3.12: + version "0.3.12" + resolved "https://registry.yarnpkg.com/gulp-esbuild/-/gulp-esbuild-0.3.12.tgz#3b8b8e8110b445af76b3fb145fc208d86a6d0ef5" + integrity sha512-gUNMGMnfvF7tHvJilpXqH67phe25jVDnstqQQ69mS7DsPtI4LKPnF8y5o0rt56ww8+Pf9MmT+sKJfErqUGt+RA== + dependencies: + esbuild "^0.8.29" + plugin-error "^1.0.1" + vinyl "^2.2.1" + gulp-eslint@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/gulp-eslint/-/gulp-eslint-5.0.0.tgz#2a2684095f774b2cf79310262078c56cc7a12b52" @@ -4732,22 +4746,6 @@ gulp-tsb@4.0.5: through "^2.3.6" vinyl "^2.1.0" -gulp-uglify@^3.0.0: - version "3.0.2" - resolved "https://registry.yarnpkg.com/gulp-uglify/-/gulp-uglify-3.0.2.tgz#5f5b2e8337f879ca9dec971feb1b82a5a87850b0" - integrity sha512-gk1dhB74AkV2kzqPMQBLA3jPoIAPd/nlNzP2XMDSG8XZrqnlCiDGAqC+rZOumzFvB5zOphlFh6yr3lgcAb/OOg== - dependencies: - array-each "^1.0.1" - extend-shallow "^3.0.2" - gulplog "^1.0.0" - has-gulplog "^0.1.0" - isobject "^3.0.1" - make-error-cause "^1.1.1" - safe-buffer "^5.1.2" - through2 "^2.0.0" - uglify-js "^3.0.5" - vinyl-sourcemaps-apply "^0.2.0" - gulp-untar@^0.0.7: version "0.0.7" resolved "https://registry.yarnpkg.com/gulp-untar/-/gulp-untar-0.0.7.tgz#92067d79e0fa1e92d60562a100233a44a5aa08b4" @@ -6383,18 +6381,6 @@ make-dir@^3.0.2: dependencies: semver "^6.0.0" -make-error-cause@^1.1.1: - version "1.2.2" - resolved "https://registry.yarnpkg.com/make-error-cause/-/make-error-cause-1.2.2.tgz#df0388fcd0b37816dff0a5fb8108939777dcbc9d" - integrity sha1-3wOI/NCzeBbf8KX7gQiTl3fcvJ0= - dependencies: - make-error "^1.2.0" - -make-error@^1.2.0: - version "1.3.6" - resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" - integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== - make-iterator@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/make-iterator/-/make-iterator-1.0.1.tgz#29b33f312aa8f547c4a5e490f56afcec99133ad6" @@ -10000,7 +9986,7 @@ terser-webpack-plugin@^1.4.3: webpack-sources "^1.4.0" worker-farm "^1.7.0" -terser@^4.1.2, terser@^4.8.0: +terser@^4.1.2: version "4.8.0" resolved "https://registry.yarnpkg.com/terser/-/terser-4.8.0.tgz#63056343d7c70bb29f3af665865a46fe03a0df17" integrity sha512-EAPipTNeWsb/3wLPeup1tVPaXfIaU68xMnVdPafIL1TV05OhASArYyIfFvnvJCNrR2NIOvDVNNTFRa+Re2MWyw== @@ -10305,11 +10291,6 @@ typical@^4.0.0: resolved "https://registry.yarnpkg.com/typical/-/typical-4.0.0.tgz#cbeaff3b9d7ae1e2bbfaf5a4e6f11eccfde94fc4" integrity sha512-VAH4IvQ7BDFYglMd7BPRDfLgxZZX4O4TFcRDA6EN5X7erNJJq+McIEp8np9aVtxrCJ6qx4GTYVfOWNjcqwZgRw== -uglify-js@^3.0.5: - version "3.12.2" - resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.12.2.tgz#c7ae89da0ed1bb58999c7fce07190b347fdbdaba" - integrity sha512-rWYleAvfJPjduYCt+ELvzybNah/zIkRteGXIBO8X0lteRZPGladF61hFi8tU7qKTsF7u6DUQCtT9k00VlFOgkg== - ultron@~1.1.0: version "1.1.1" resolved "https://registry.yarnpkg.com/ultron/-/ultron-1.1.1.tgz#9fe1536a10a664a65266a1e3ccf85fd36302bc9c" @@ -10608,7 +10589,7 @@ vinyl-sourcemap@^1.1.0: remove-bom-buffer "^3.0.0" vinyl "^2.0.0" -vinyl-sourcemaps-apply@^0.2.0, vinyl-sourcemaps-apply@^0.2.1: +vinyl-sourcemaps-apply@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/vinyl-sourcemaps-apply/-/vinyl-sourcemaps-apply-0.2.1.tgz#ab6549d61d172c2b1b87be5c508d239c8ef87705" integrity sha1-q2VJ1h0XLCsbh75cUI0jnI74dwU= @@ -10657,6 +10638,18 @@ vinyl@^2.0.2, vinyl@^2.2.0: remove-trailing-separator "^1.0.1" replace-ext "^1.0.0" +vinyl@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/vinyl/-/vinyl-2.2.1.tgz#23cfb8bbab5ece3803aa2c0a1eb28af7cbba1974" + integrity sha512-LII3bXRFBZLlezoG5FfZVcXflZgWP/4dCwKtxd5ky9+LOtM4CS3bIRQsmR1KMnMW07jpE8fqR2lcxPZ+8sJIcw== + dependencies: + clone "^2.1.1" + clone-buffer "^1.0.0" + clone-stats "^1.0.0" + cloneable-readable "^1.0.0" + remove-trailing-separator "^1.0.1" + replace-ext "^1.0.0" + vinyl@~2.0.1: version "2.0.2" resolved "https://registry.yarnpkg.com/vinyl/-/vinyl-2.0.2.tgz#0a3713d8d4e9221c58f10ca16c0116c9e25eda7c"