diff --git a/packages/configs/default/index.json b/packages/configs/default/index.json index 78c7017f34f..2f734f5b08c 100644 --- a/packages/configs/default/index.json +++ b/packages/configs/default/index.json @@ -58,6 +58,7 @@ "reporters": [ "@parcel/reporter-cli", "@parcel/reporter-dev-server", - "@parcel/reporter-bundle-analyzer" + "@parcel/reporter-bundle-analyzer", + "@parcel/reporter-bundle-buddy" ] } diff --git a/packages/configs/default/package.json b/packages/configs/default/package.json index e9949872100..018f3c954ce 100644 --- a/packages/configs/default/package.json +++ b/packages/configs/default/package.json @@ -27,6 +27,7 @@ "@parcel/packager-raw-url": "^2.0.0-alpha.3.1", "@parcel/packager-ts": "^2.0.0-alpha.3.1", "@parcel/reporter-bundle-analyzer": "^2.0.0-alpha.3.1", + "@parcel/reporter-bundle-buddy": "^2.0.0-alpha.3.1", "@parcel/reporter-cli": "^2.0.0-alpha.3.1", "@parcel/reporter-dev-server": "^2.0.0-alpha.3.1", "@parcel/resolver-default": "^2.0.0-alpha.3.1", diff --git a/packages/reporters/bundle-buddy/package.json b/packages/reporters/bundle-buddy/package.json new file mode 100644 index 00000000000..af0f2ba3ea2 --- /dev/null +++ b/packages/reporters/bundle-buddy/package.json @@ -0,0 +1,21 @@ +{ + "name": "@parcel/reporter-bundle-buddy", + "version": "2.0.0-alpha.3.1", + "license": "MIT", + "publishConfig": { + "access": "public" + }, + "repository": { + "type": "git", + "url": "https://github.com/parcel-bundler/parcel.git" + }, + "main": "lib/BundleBuddyReporter.js", + "source": "src/BundleBuddyReporter.js", + "engines": { + "node": ">= 10.0.0", + "parcel": "^2.0.0-alpha.1.1" + }, + "dependencies": { + "@parcel/plugin": "^2.0.0-alpha.3.1" + } +} diff --git a/packages/reporters/bundle-buddy/src/BundleBuddyReporter.js b/packages/reporters/bundle-buddy/src/BundleBuddyReporter.js new file mode 100644 index 00000000000..6a0ac093219 --- /dev/null +++ b/packages/reporters/bundle-buddy/src/BundleBuddyReporter.js @@ -0,0 +1,51 @@ +// @flow strict-local +import type {NamedBundle} from '@parcel/types'; +import {Reporter} from '@parcel/plugin'; +import path from 'path'; + +export default new Reporter({ + async report({event, options}) { + if (event.type !== 'buildSuccess' || process.env.BUNDLE_BUDDY == null) { + return; + } + + let bundlesByTarget: Map> = new Map(); + for (let bundle of event.bundleGraph.getBundles()) { + if (!bundle.isInline) { + let bundles = bundlesByTarget.get(bundle.target.distDir); + if (!bundles) { + bundles = []; + bundlesByTarget.set(bundle.target.distDir, bundles); + } + + bundles.push(bundle); + } + } + + for (let [targetDir, bundles] of bundlesByTarget) { + let out = []; + + for (let bundle of bundles) { + bundle.traverseAssets(asset => { + let deps = event.bundleGraph.getDependencies(asset); + for (let dep of deps) { + let resolved = event.bundleGraph.getDependencyResolution(dep); + if (!resolved) { + continue; + } + + out.push({ + source: path.relative(options.projectRoot, asset.filePath), + target: path.relative(options.projectRoot, resolved.filePath), + }); + } + }); + } + + await options.outputFS.writeFile( + `${targetDir}/bundle-buddy.json`, + JSON.stringify(out), + ); + } + }, +});