diff --git a/packages/optimizers/swc/package.json b/packages/optimizers/swc/package.json new file mode 100644 index 00000000000..6adcfa91fb7 --- /dev/null +++ b/packages/optimizers/swc/package.json @@ -0,0 +1,29 @@ +{ + "name": "@parcel/optimizer-swc", + "version": "2.0.0", + "license": "MIT", + "publishConfig": { + "access": "public" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "repository": { + "type": "git", + "url": "https://github.com/parcel-bundler/parcel.git" + }, + "main": "lib/SwcOptimizer.js", + "source": "src/SwcOptimizer.js", + "engines": { + "node": ">= 12.0.0", + "parcel": "^2.0.0" + }, + "dependencies": { + "@parcel/plugin": "^2.0.0", + "@parcel/source-map": "^2.0.0", + "@parcel/utils": "^2.0.0", + "@swc/core": "^1.2.105", + "nullthrows": "^1.1.1" + } +} diff --git a/packages/optimizers/swc/src/SwcOptimizer.js b/packages/optimizers/swc/src/SwcOptimizer.js new file mode 100644 index 00000000000..cf54c18ad48 --- /dev/null +++ b/packages/optimizers/swc/src/SwcOptimizer.js @@ -0,0 +1,75 @@ +// @flow + +import nullthrows from 'nullthrows'; +import {minify} from '@swc/core'; +import {Optimizer} from '@parcel/plugin'; +import {blobToString} from '@parcel/utils'; +import SourceMap from '@parcel/source-map'; + +import path from 'path'; + +export default (new Optimizer({ + async loadConfig({config, options}) { + let userConfig = await config.getConfigFrom( + path.join(options.projectRoot, 'index'), + ['.terserrc', '.terserrc.js'], + ); + + if (userConfig) { + let isJavascript = path.extname(userConfig.filePath) === '.js'; + if (isJavascript) { + config.invalidateOnStartup(); + } + } + + return userConfig?.contents; + }, + async optimize({ + contents, + map: originalMap, + bundle, + config: userConfig, + options, + getSourceMapReference, + }) { + if (!bundle.env.shouldOptimize) { + return {contents, map: originalMap}; + } + + let code = await blobToString(contents); + let config = { + ...userConfig, + sourceMap: bundle.env.sourceMap + ? { + filename: path.relative( + options.projectRoot, + path.join(bundle.target.distDir, bundle.name), + ), + } + : false, + toplevel: + bundle.env.outputFormat === 'esmodule' || + bundle.env.outputFormat === 'commonjs', + module: bundle.env.outputFormat === 'esmodule', + }; + + let result = await minify(code, config); + + let sourceMap = null; + let minifiedContents: string = nullthrows(result.code); + let resultMap = result.map; + if (resultMap) { + sourceMap = new SourceMap(options.projectRoot); + sourceMap.addVLQMap(JSON.parse(resultMap)); + if (originalMap) { + sourceMap.extends(originalMap); + } + let sourcemapReference = await getSourceMapReference(sourceMap); + if (sourcemapReference) { + minifiedContents += `\n//# sourceMappingURL=${sourcemapReference}\n`; + } + } + + return {contents: minifiedContents, map: sourceMap}; + }, +}): Optimizer); diff --git a/yarn.lock b/yarn.lock index fc1de409701..db456792ff8 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1904,6 +1904,18 @@ toml "^3.0.0" tslib "^2.1.0" +"@napi-rs/triples@^1.0.3": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@napi-rs/triples/-/triples-1.0.3.tgz#76d6d0c3f4d16013c61e45dfca5ff1e6c31ae53c" + integrity sha512-jDJTpta+P4p1NZTFVLHJ/TLFVYVcOqv6l8xwOeBKNPMgY/zDYH/YH7SJbvrr/h1RcS9GzbPcLKGzpuK9cV56UA== + +"@node-rs/helper@^1.0.0": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@node-rs/helper/-/helper-1.2.1.tgz#e079b05f21ff4329d82c4e1f71c0290e4ecdc70c" + integrity sha512-R5wEmm8nbuQU0YGGmYVjEc0OHtYsuXdpRG+Ut/3wZ9XAvQWyThN08bTh2cBJgoZxHQUPtvRfeQuxcAgLuiBISg== + dependencies: + "@napi-rs/triples" "^1.0.3" + "@nodelib/fs.scandir@2.1.3": version "2.1.3" resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.3.tgz#3a582bdb53804c6ba6d146579c46e52130cf4a3b" @@ -2255,6 +2267,80 @@ deepmerge "^4.2.2" svgo "^1.2.2" +"@swc/core-android-arm64@^1.2.105": + version "1.2.105" + resolved "https://registry.yarnpkg.com/@swc/core-android-arm64/-/core-android-arm64-1.2.105.tgz#ff50fbbb6b15c8f3f27a1def98b8e350c834a5bc" + integrity sha512-wxSakNR3mw9oLD/pIBNlTU088Yoblto95ZwKJPl02fod9YPphx5FhxmVPaj6af/X2dxLsW3NQKwJhvPVAmP5MA== + +"@swc/core-darwin-arm64@^1.2.105": + version "1.2.105" + resolved "https://registry.yarnpkg.com/@swc/core-darwin-arm64/-/core-darwin-arm64-1.2.105.tgz#69e96391bbda1b56fa3fe8c511ced886050f44a7" + integrity sha512-v29DW4yf+TrSeexR2oBlGLZXMnu1AzOBdkiLNe4oBaX7+m+oUakq+Z+9lWcv04XKyxymrJAQW3pbV/inYjrXyA== + +"@swc/core-darwin-x64@^1.2.105": + version "1.2.105" + resolved "https://registry.yarnpkg.com/@swc/core-darwin-x64/-/core-darwin-x64-1.2.105.tgz#15f51e8c22d323243a6c91be97d3da6e6763d8a4" + integrity sha512-+zFS0Vj//dbBKgDka785v0Ik4HsQmml11X7ZyBRtmhmMyx4uLPSo2mFh/9PaxOED6SwOfE3nLPuJfnd0TYl2EQ== + +"@swc/core-linux-arm-gnueabihf@^1.2.105": + version "1.2.105" + resolved "https://registry.yarnpkg.com/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.2.105.tgz#a126b7f1dfbce43e818e4911eafa2c92f35cacc9" + integrity sha512-GOL56Pvync/86YRIxlfkzUgbzRHM0YS6134GbwVbGK+CTeT4qdHYKg5FZigZNXu2TczMU+UalW6PwGHUDGpGZg== + +"@swc/core-linux-arm64-gnu@^1.2.105": + version "1.2.105" + resolved "https://registry.yarnpkg.com/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.2.105.tgz#02e3d0db4f32722ee83eef34e340dc633f204f9b" + integrity sha512-fLjTlrZm76N6aQ9c1U91hh1jYl+ATJXSl3WpfNAJgXZD5sVXTOOW+wFSo7wY6EH6iEiienv8S2R+e7UEyYcRTg== + +"@swc/core-linux-arm64-musl@^1.2.105": + version "1.2.105" + resolved "https://registry.yarnpkg.com/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.2.105.tgz#b2151353da3ec6068e69b1a590f98e1913c5727b" + integrity sha512-yqNKqDUxNdkPULqqiZyY1z7d8EAtl17qszMvYH7S5c5nk9Tiy0IhATAcKbuWv/at+sOWNltAh0/zi1ISXOvDAA== + +"@swc/core-linux-x64-gnu@^1.2.105": + version "1.2.105" + resolved "https://registry.yarnpkg.com/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.2.105.tgz#7ee437db9a2b95e9da10ab555471862ebc41c438" + integrity sha512-Np0gSVpL5OzE8m/GbJ+vzEPz/xnxyo9zRIbo22QiFBXvcUvp81OHD6RfOg1d+Z6eVLF4//nTJ0SwcuQItisgNw== + +"@swc/core-linux-x64-musl@^1.2.105": + version "1.2.105" + resolved "https://registry.yarnpkg.com/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.2.105.tgz#45947441d99c84affb296b9ab2fe96a376ed14ac" + integrity sha512-twvrJOnL0pyUILoLkMhubjlO3ADzloaYIn7nNWnxFYLeBn2qEmXiR+2wo1A6jDEfDUdPAkmj/oKoCabh7NCpzg== + +"@swc/core-win32-arm64-msvc@^1.2.105": + version "1.2.105" + resolved "https://registry.yarnpkg.com/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.2.105.tgz#e59f267ac5ee97872cc42583b02aa53910e32920" + integrity sha512-zBj3bAHpEXaqosUqZsh9UlaQCk84iTohFf70GLWLMZa/iNEYFStdqTy7N+dVimP0WaO+cD1JZlI2gcS32FrIAw== + +"@swc/core-win32-ia32-msvc@^1.2.105": + version "1.2.105" + resolved "https://registry.yarnpkg.com/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.2.105.tgz#5c4fe065d6b86a108bc5e1f7fefd7bc87758bba9" + integrity sha512-Nl/sNaDHq5eKRzFuW4QKtHtMQ+kNPCPRltPtajqZdSRmGHhXA3wbBORq64VScPIj7jRxrqQNGu9xQE2hjlYPjA== + +"@swc/core-win32-x64-msvc@^1.2.105": + version "1.2.105" + resolved "https://registry.yarnpkg.com/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.2.105.tgz#544e92378688e3bfa1a88f0a75f56196985ad8e1" + integrity sha512-ibxGdPdFcy8P/AcM/ZKhYAbr9/QJOBsTmTSrcDYPq6pr4GkM3+DghgtgDdV/mQFAieHIHm5/XWIQXu5cSfnTtg== + +"@swc/core@^1.2.105": + version "1.2.105" + resolved "https://registry.yarnpkg.com/@swc/core/-/core-1.2.105.tgz#098a5962f6d129c9766f9679a95694d18b682661" + integrity sha512-LMji8Fs0cM6Mp7NR5h4GMDw9+UlOzy0X/yeJXMDgW/q7zmwxVqOLKUHHVXouaSNLrb6XblgqxLWsmhZLsqodQw== + dependencies: + "@node-rs/helper" "^1.0.0" + optionalDependencies: + "@swc/core-android-arm64" "^1.2.105" + "@swc/core-darwin-arm64" "^1.2.105" + "@swc/core-darwin-x64" "^1.2.105" + "@swc/core-linux-arm-gnueabihf" "^1.2.105" + "@swc/core-linux-arm64-gnu" "^1.2.105" + "@swc/core-linux-arm64-musl" "^1.2.105" + "@swc/core-linux-x64-gnu" "^1.2.105" + "@swc/core-linux-x64-musl" "^1.2.105" + "@swc/core-win32-arm64-msvc" "^1.2.105" + "@swc/core-win32-ia32-msvc" "^1.2.105" + "@swc/core-win32-x64-msvc" "^1.2.105" + "@swc/helpers@^0.2.11": version "0.2.11" resolved "https://registry.yarnpkg.com/@swc/helpers/-/helpers-0.2.11.tgz#34c842dcd8182810b4ab72d0d1fc34b553909e2e" @@ -3516,9 +3602,9 @@ caniuse-api@^3.0.0: lodash.uniq "^4.5.0" caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001219: - version "1.0.30001271" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001271.tgz#0dda0c9bcae2cf5407cd34cac304186616cc83e8" - integrity sha512-BBruZFWmt3HFdVPS8kceTBIguKxu4f99n5JNp06OlPD/luoAMIaIK5ieV5YjnBLH3Nysai9sxj9rpJj4ZisXOA== + version "1.0.30001272" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001272.tgz#8e9790ff995e9eb6e1f4c45cd07ddaa87cddbb14" + integrity sha512-DV1j9Oot5dydyH1v28g25KoVm7l8MTxazwuiH3utWiAS6iL/9Nh//TGwqFEeqqN8nnWYQ8HHhUq+o4QPt9kvYw== caseless@~0.12.0: version "0.12.0" @@ -9931,7 +10017,7 @@ performance-now@^2.1.0: resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= -picomatch@^2.0.4, picomatch@^2.0.5, picomatch@^2.2.1, picomatch@^2.2.3: +picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.3: version "2.3.0" resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.0.tgz#f1f061de8f6a4bf022892e2d128234fb98302972" integrity sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==