From 6ce9e707443e609e1961d24a6563bc68a83a1486 Mon Sep 17 00:00:00 2001 From: Niklas Mischkulnig <4586894+mischnic@users.noreply.github.com> Date: Wed, 3 Mar 2021 21:00:18 +0100 Subject: [PATCH] Allow specifying reporters on the CLI (#5905) --- packages/configs/default/index.json | 6 +--- packages/configs/default/package.json | 2 -- packages/core/core/src/BundlerRunner.js | 17 ++--------- packages/core/core/src/ParcelConfig.js | 2 +- packages/core/core/src/Transformation.js | 2 +- packages/core/core/src/UncommittedAsset.js | 2 +- packages/core/core/src/loadParcelPlugin.js | 30 +++++++++++-------- .../core/src/requests/ParcelConfigRequest.js | 11 +++++++ packages/core/core/src/resolveOptions.js | 1 + packages/core/core/src/types.js | 6 +++- packages/core/core/src/utils.js | 1 + packages/core/core/test/test-utils.js | 1 + packages/core/integration-tests/test/api.js | 23 ++++++++++++++ packages/core/package-manager/src/Yarn.js | 2 +- packages/core/parcel/package.json | 2 ++ packages/core/parcel/src/cli.js | 30 ++++++++++++++++--- packages/core/types/index.js | 5 ++++ .../src/BundleAnalyzerReporter.js | 7 +---- .../bundle-buddy/src/BundleBuddyReporter.js | 17 ++++++----- 19 files changed, 110 insertions(+), 57 deletions(-) diff --git a/packages/configs/default/index.json b/packages/configs/default/index.json index 482d0967619..6a4a93bbc83 100644 --- a/packages/configs/default/index.json +++ b/packages/configs/default/index.json @@ -65,9 +65,5 @@ "*.{jsonld,webmanifest}": "@parcel/packager-raw-url", "*": "@parcel/packager-raw" }, - "resolvers": ["@parcel/resolver-default"], - "reporters": [ - "@parcel/reporter-cli", - "@parcel/reporter-dev-server" - ] + "resolvers": ["@parcel/resolver-default"] } diff --git a/packages/configs/default/package.json b/packages/configs/default/package.json index 52a92c03d7b..f26cfb804a4 100644 --- a/packages/configs/default/package.json +++ b/packages/configs/default/package.json @@ -23,8 +23,6 @@ "@parcel/optimizer-terser": "2.0.0-beta.1", "@parcel/packager-js": "2.0.0-beta.1", "@parcel/packager-raw": "2.0.0-beta.1", - "@parcel/reporter-cli": "2.0.0-beta.1", - "@parcel/reporter-dev-server": "2.0.0-beta.1", "@parcel/resolver-default": "2.0.0-beta.1", "@parcel/runtime-browser-hmr": "2.0.0-beta.1", "@parcel/runtime-js": "2.0.0-beta.1", diff --git a/packages/core/core/src/BundlerRunner.js b/packages/core/core/src/BundlerRunner.js index a7742fbaba3..585ea798f28 100644 --- a/packages/core/core/src/BundlerRunner.js +++ b/packages/core/core/src/BundlerRunner.js @@ -1,14 +1,9 @@ // @flow strict-local import type {AbortSignal} from 'abortcontroller-polyfill/dist/cjs-ponyfill'; -import type { - Bundle as IBundle, - Namer, - FilePath, - ConfigOutput, -} from '@parcel/types'; +import type {Bundle as IBundle, Namer, ConfigOutput} from '@parcel/types'; import type WorkerFarm, {SharedReference} from '@parcel/workers'; -import type ParcelConfig from './ParcelConfig'; +import type ParcelConfig, {LoadedPlugin} from './ParcelConfig'; import type RequestTracker from './RequestTracker'; import type {Bundle as InternalBundle, ParcelOptions} from './types'; @@ -210,13 +205,7 @@ export default class BundlerRunner { } async nameBundle( - namers: Array<{| - name: string, - version: string, - plugin: Namer, - resolveFrom: FilePath, - keyPath: string, - |}>, + namers: Array>, internalBundle: InternalBundle, internalBundleGraph: InternalBundleGraph, ): Promise { diff --git a/packages/core/core/src/ParcelConfig.js b/packages/core/core/src/ParcelConfig.js index 6bda2db3175..6200167a6ff 100644 --- a/packages/core/core/src/ParcelConfig.js +++ b/packages/core/core/src/ParcelConfig.js @@ -38,7 +38,7 @@ export type LoadedPlugin = {| version: Semver, plugin: T, resolveFrom: FilePath, - keyPath: string, + keyPath?: string, |}; export default class ParcelConfig { diff --git a/packages/core/core/src/Transformation.js b/packages/core/core/src/Transformation.js index de7e8acf942..3aea2611bbe 100644 --- a/packages/core/core/src/Transformation.js +++ b/packages/core/core/src/Transformation.js @@ -859,7 +859,7 @@ type TransformerWithNameAndConfig = {| name: PackageName, plugin: Transformer, config: ?Config, - configKeyPath: string, + configKeyPath?: string, resolveFrom: FilePath, |}; diff --git a/packages/core/core/src/UncommittedAsset.js b/packages/core/core/src/UncommittedAsset.js index 14a3e29c8bd..77e05803980 100644 --- a/packages/core/core/src/UncommittedAsset.js +++ b/packages/core/core/src/UncommittedAsset.js @@ -351,7 +351,7 @@ export default class UncommittedAsset { result: TransformerResult, plugin: PackageName, configPath: FilePath, - configKeyPath: string, + configKeyPath?: string, ): UncommittedAsset { let content = result.content ?? null; diff --git a/packages/core/core/src/loadParcelPlugin.js b/packages/core/core/src/loadParcelPlugin.js index f44ed2087a2..93f1004c855 100644 --- a/packages/core/core/src/loadParcelPlugin.js +++ b/packages/core/core/src/loadParcelPlugin.js @@ -23,7 +23,7 @@ const NODE_MODULES = `${path.sep}node_modules${path.sep}`; export default async function loadPlugin( pluginName: PackageName, configPath: FilePath, - keyPath: string, + keyPath?: string, options: ParcelOptions, ): Promise<{|plugin: T, version: Semver, resolveFrom: FilePath|}> { let resolveFrom = configPath; @@ -105,18 +105,22 @@ export default async function loadPlugin( origin: '@parcel/core', filePath: configPath, language: 'json5', - codeFrame: { - code: configContents, - codeHighlights: generateJSONCodeHighlights(configContents, [ - { - key: keyPath, - type: 'value', - message: md`Cannot find module "${pluginName}"${ - alternatives[0] ? `, did you mean "${alternatives[0]}"?` : '' - }`, - }, - ]), - }, + codeFrame: keyPath + ? { + code: configContents, + codeHighlights: generateJSONCodeHighlights(configContents, [ + { + key: keyPath, + type: 'value', + message: md`Cannot find module "${pluginName}"${ + alternatives[0] + ? `, did you mean "${alternatives[0]}"?` + : '' + }`, + }, + ]), + } + : undefined, }, }); } diff --git a/packages/core/core/src/requests/ParcelConfigRequest.js b/packages/core/core/src/requests/ParcelConfigRequest.js index 691c7bb891f..2ecc58fc546 100644 --- a/packages/core/core/src/requests/ParcelConfigRequest.js +++ b/packages/core/core/src/requests/ParcelConfigRequest.js @@ -172,6 +172,17 @@ export async function resolveParcelConfig( contents, options, ); + + if (options.additionalReporters.length > 0) { + config.reporters = [ + ...options.additionalReporters.map(({packageName, resolveFrom}) => ({ + packageName, + resolveFrom, + })), + ...(config.reporters ?? []), + ]; + } + return {config, extendedFiles, usedDefault}; } diff --git a/packages/core/core/src/resolveOptions.js b/packages/core/core/src/resolveOptions.js index 7ea05c44a82..13b6659ddbd 100644 --- a/packages/core/core/src/resolveOptions.js +++ b/packages/core/core/src/resolveOptions.js @@ -127,6 +127,7 @@ export default async function resolveOptions( outputFS, cache, packageManager, + additionalReporters: initialOptions.additionalReporters ?? [], instanceId: generateInstanceId(entries), detailedReport: initialOptions.detailedReport, defaultTargetOptions: { diff --git a/packages/core/core/src/types.js b/packages/core/core/src/types.js index 70460e25d3d..96593138762 100644 --- a/packages/core/core/src/types.js +++ b/packages/core/core/src/types.js @@ -37,7 +37,7 @@ import type {PackageManager} from '@parcel/package-manager'; export type ParcelPluginNode = {| packageName: PackageName, resolveFrom: FilePath, - keyPath: string, + keyPath?: string, |}; export type PureParcelConfigPipeline = $ReadOnlyArray; @@ -196,6 +196,10 @@ export type ParcelOptions = {| outputFS: FileSystem, cache: Cache, packageManager: PackageManager, + additionalReporters: Array<{| + packageName: ModuleSpecifier, + resolveFrom: FilePath, + |}>, instanceId: string, diff --git a/packages/core/core/src/utils.js b/packages/core/core/src/utils.js index 4a282bb69a6..0650c538dcc 100644 --- a/packages/core/core/src/utils.js +++ b/packages/core/core/src/utils.js @@ -96,6 +96,7 @@ const ignoreOptions = new Set([ 'shouldProfile', 'shouldPatchConsole', 'projectRoot', + 'additionalReporters', ]); export function optionsProxy( diff --git a/packages/core/core/test/test-utils.js b/packages/core/core/test/test-utils.js index 58a17094325..d52f638a5c9 100644 --- a/packages/core/core/test/test-utils.js +++ b/packages/core/core/test/test-utils.js @@ -34,6 +34,7 @@ export const DEFAULT_OPTIONS: ParcelOptions = { cache, shouldPatchConsole: false, packageManager: new NodePackageManager(inputFS), + additionalReporters: [], instanceId: 'test', defaultTargetOptions: { shouldScopeHoist: false, diff --git a/packages/core/integration-tests/test/api.js b/packages/core/integration-tests/test/api.js index d5fe91a9d23..97ecfd92002 100644 --- a/packages/core/integration-tests/test/api.js +++ b/packages/core/integration-tests/test/api.js @@ -26,4 +26,27 @@ describe('JS API', function() { assert(await outputFS.exists(path.join(distDir, NAME))); }); + + it('should run additional reports from the options', async function() { + let b = await bundle( + path.join(__dirname, '/integration/js-comment/index.js'), + { + additionalReporters: [ + { + packageName: '@parcel/reporter-bundle-buddy', + resolveFrom: __dirname, + }, + ], + }, + ); + + assertBundles(b, [ + { + type: 'js', + assets: ['index.js'], + }, + ]); + + assert(await outputFS.exists(path.join(distDir, 'bundle-buddy.json'))); + }); }); diff --git a/packages/core/package-manager/src/Yarn.js b/packages/core/package-manager/src/Yarn.js index b0fc7e0a8d8..b63bdebe5d7 100644 --- a/packages/core/package-manager/src/Yarn.js +++ b/packages/core/package-manager/src/Yarn.js @@ -135,7 +135,7 @@ export class Yarn implements PackageInstaller { try { return await promiseFromProcess(installProcess); } catch (e) { - throw new Error('Yarn failed to install modules'); + throw new Error('Yarn failed to install modules:' + e.message); } } } diff --git a/packages/core/parcel/package.json b/packages/core/parcel/package.json index b1ea17d9bfa..f5516aa0707 100644 --- a/packages/core/parcel/package.json +++ b/packages/core/parcel/package.json @@ -28,6 +28,8 @@ "@parcel/fs": "2.0.0-beta.1", "@parcel/logger": "2.0.0-beta.1", "@parcel/package-manager": "2.0.0-beta.1", + "@parcel/reporter-cli": "2.0.0-beta.1", + "@parcel/reporter-dev-server": "2.0.0-beta.1", "@parcel/utils": "2.0.0-beta.1", "chalk": "^4.1.0", "commander": "^7.0.0", diff --git a/packages/core/parcel/src/cli.js b/packages/core/parcel/src/cli.js index d818d7794b4..76a9d2a20b5 100755 --- a/packages/core/parcel/src/cli.js +++ b/packages/core/parcel/src/cli.js @@ -81,10 +81,18 @@ const commonOptions = { '--profile': 'enable build profiling', '-V, --version': 'output the version number', '--detailed-report [count]': [ - 'Print the asset timings and sizes in the build report', + 'print the asset timings and sizes in the build report', parseOptionInt, '10', ], + '--reporter ': [ + 'additional reporters to run', + (val, acc) => { + acc.push(val); + return acc; + }, + [], + ], }; var hmrOptions = { @@ -201,17 +209,18 @@ async function run( entries = entries.map(entry => path.resolve(entry)); if (entries.length === 0) { + // TODO move this into core, a glob could still lead to no entries INTERNAL_ORIGINAL_CONSOLE.log('No entries found'); return; } let Parcel = require('@parcel/core').default; - let options = await normalizeOptions(command); let fs = new NodeFS(); + let options = await normalizeOptions(command, fs); let packageManager = new NodePackageManager(fs); let parcel = new Parcel({ entries, packageManager, - // $FlowFixMe - flow doesn't know about the `paths` option (added in Node v8.9.0) + // $FlowFixMe[extra-arg] - flow doesn't know about the `paths` option (added in Node v8.9.0) defaultConfig: require.resolve('@parcel/config-default', { paths: [fs.cwd(), __dirname], }), @@ -358,7 +367,10 @@ function parseOptionInt(value) { return parsedValue; } -async function normalizeOptions(command): Promise { +async function normalizeOptions( + command, + inputFS, +): Promise { let nodeEnv; if (command.name() === 'build') { nodeEnv = process.env.NODE_ENV || 'production'; @@ -423,6 +435,15 @@ async function normalizeOptions(command): Promise { command.detailedReport = '10'; } + let additionalReporters = [ + {packageName: '@parcel/reporter-cli', resolveFrom: __filename}, + {packageName: '@parcel/reporter-dev-server', resolveFrom: __filename}, + ...(command.reporter: Array).map(packageName => ({ + packageName, + resolveFrom: path.join(inputFS.cwd(), 'index'), + })), + ]; + let mode = command.name() === 'build' ? 'production' : 'development'; return { shouldDisableCache: command.cache === false, @@ -445,6 +466,7 @@ async function normalizeOptions(command): Promise { env: { NODE_ENV: nodeEnv, }, + additionalReporters, defaultTargetOptions: { shouldOptimize: command.optimize != null ? command.optimize : mode === 'production', diff --git a/packages/core/types/index.js b/packages/core/types/index.js index 13b204afd14..54abb02460d 100644 --- a/packages/core/types/index.js +++ b/packages/core/types/index.js @@ -288,6 +288,11 @@ export type InitialParcelOptions = {| +engines?: Engines, |}, + +additionalReporters?: Array<{| + packageName: ModuleSpecifier, + resolveFrom: FilePath, + |}>, + // throwErrors // global? |}; diff --git a/packages/reporters/bundle-analyzer/src/BundleAnalyzerReporter.js b/packages/reporters/bundle-analyzer/src/BundleAnalyzerReporter.js index 1d29ab9c3f1..e94713387db 100644 --- a/packages/reporters/bundle-analyzer/src/BundleAnalyzerReporter.js +++ b/packages/reporters/bundle-analyzer/src/BundleAnalyzerReporter.js @@ -10,12 +10,7 @@ import nullthrows from 'nullthrows'; export default (new Reporter({ async report({event, options}) { - if ( - event.type !== 'buildSuccess' || - process.env.PARCEL_BUNDLE_ANALYZER == null || - // $FlowFixMe - process.env.PARCEL_BUNDLE_ANALYZER == false - ) { + if (event.type !== 'buildSuccess') { return; } diff --git a/packages/reporters/bundle-buddy/src/BundleBuddyReporter.js b/packages/reporters/bundle-buddy/src/BundleBuddyReporter.js index 3f66a05cb52..add1353babe 100644 --- a/packages/reporters/bundle-buddy/src/BundleBuddyReporter.js +++ b/packages/reporters/bundle-buddy/src/BundleBuddyReporter.js @@ -4,13 +4,8 @@ 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 || - // $FlowFixMe - process.env.BUNDLE_BUDDY == false - ) { + async report({event, options, logger}) { + if (event.type !== 'buildSuccess') { return; } @@ -48,9 +43,15 @@ export default (new Reporter({ } await options.outputFS.writeFile( - `${targetDir}/bundle-buddy.json`, + path.join(targetDir, 'bundle-buddy.json'), JSON.stringify(out), ); + logger.info({ + message: `Wrote report to ${path.relative( + options.outputFS.cwd(), + path.join(targetDir, 'bundle-buddy.json'), + )}`, + }); } }, }): Reporter);