You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

138 lines
3.6 KiB
JavaScript

"use strict";
const babelOptions = require( "./babelOptions" );
const ms = require( "pretty-ms" );
const rollup = require( "rollup" );
const babel = require( "rollup-plugin-babel" );
const commonjs = require( "rollup-plugin-commonjs" );
const json = require( "rollup-plugin-json" );
const multiEntry = require( "rollup-plugin-multi-entry" );
const resolve = require( "rollup-plugin-node-resolve" );
const { terser } = require( "rollup-plugin-terser" );
// pretty-path
function pp( p ) {
return ( Array.isArray( p ) ? p.join( ", " ) : p )
.replace( process.cwd(), "" )
.replace( /\\/g, "/" )
.replace( /^\//, "" );
}
// based on https://github.com/rollup/rollup/blob/master/bin/src/logging.ts
function handleError( err ) {
let description = err.message || err;
if ( err.name ) description = `${ err.name }: ${ description }`;
const message = err.plugin ? `(${ err.plugin } plugin) ${ description }` : description;
console.error( message.toString() );
if ( err.url ) console.error( err.url );
if ( err.loc )
console.error( `${ err.loc.file || err.id } (${ err.loc.line }:${ err.loc.column })` );
else if ( err.id )
console.error( err.id );
if ( err.frame ) console.error( err.frame );
if ( err.stack ) console.error( err.stack );
}
module.exports = bundle => {
const log = bundle.silent === true ? () => void 0 : console.info;
const plugins = [
resolve(),
commonjs(),
json( { namedExports: false } ),
babel( babelOptions ),
];
if ( bundle.source.includes( "*" ) ) plugins.unshift( multiEntry() );
if ( bundle.target.endsWith( ".min.js" ) )
plugins.push( terser( { output: { comments: /MIT License/ } } ) );
const config = {
input: bundle.source,
output: {
banner: bundle.banner,
file: bundle.target,
format: bundle.format || "iife",
interop: false,
name: bundle.name,
},
plugins,
onwarn( warning, warn ) {
if ( warning.code === "CIRCULAR_DEPENDENCY" ) return void 0;
if ( warning.code === "NAMESPACE_CONFLICT" ) return void 0;
if ( warning.code === "EVAL" ) return void 0;
if ( bundle.silent !== true ) warn( warning );
},
treeshake: {
propertyReadSideEffects: true,
},
watch: {
exclude: "node_modules/**",
},
};
if ( bundle.watch !== true ) {
return rollup.rollup( config )
.then( bundle => bundle.write( config.output ) )
.then( () => {
log( `@pegjs/bundle-generator > created ${ pp( bundle.target ) }` );
} )
.catch( handleError );
}
const watcher = rollup.watch( config );
// https://rollupjs.org/guide/en#rollup-watch
watcher.on( "event", event => {
switch ( event.code ) {
case "BUNDLE_START":
log( `@pegjs/bundle-generator > watching ${ pp( event.input ) }` );
break;
case "BUNDLE_END":
log( `@pegjs/bundle-generator > created ${ pp( event.output ) } in ${ ms( event.duration ) }` );
break;
case "ERROR":
handleError( event.error );
break;
case "FATAL":
console.error( "@pegjs/bundle-generator > Fatel Error!" );
handleError( event.error );
break;
}
} );
process.on( "exit", () => watcher.close() );
return watcher;
};