From 47d4ec71e499d1fdaa98ed3d362830fec2bf4372 Mon Sep 17 00:00:00 2001 From: Bogdan Chadkin Date: Sat, 8 Apr 2017 14:17:29 +0300 Subject: [PATCH] Build umd with rollup (#341) * Build umd with rollup * Tidy up * Fix scripts lint * Fix deps --- package.json | 9 ++- rollup.config.js | 57 ++++++++++++++++++ scripts/getPackageNames.js | 14 ++--- scripts/installNestedPackageDeps.js | 6 +- scripts/release.js | 89 ++++++++++++----------------- webpack.config.js | 35 ------------ 6 files changed, 111 insertions(+), 99 deletions(-) create mode 100644 rollup.config.js delete mode 100644 webpack.config.js diff --git a/package.json b/package.json index 12eb692e..d800d187 100644 --- a/package.json +++ b/package.json @@ -19,7 +19,7 @@ "babel-cli": "^6.5.1", "babel-core": "^6.5.2", "babel-eslint": "^6.0.4", - "babel-loader": "^6.2.4", + "babel-plugin-external-helpers": "^6.22.0", "babel-plugin-syntax-jsx": "^6.8.0", "babel-plugin-syntax-trailing-function-commas": "^6.8.0", "babel-plugin-transform-async-to-generator": "^6.8.0", @@ -72,11 +72,16 @@ "react-dom": "^15.0.0", "readline-sync": "^1.2.21", "rimraf": "^2.4.3", + "rollup": "^0.41.6", + "rollup-plugin-babel": "^2.7.1", + "rollup-plugin-commonjs": "^8.0.2", + "rollup-plugin-node-resolve": "^3.0.0", + "rollup-plugin-replace": "^1.1.1", + "rollup-plugin-uglify": "^1.0.1", "rx": "^4.1.0", "rxjs": "^5.0.0-beta.9", "shelljs": "^0.6.0", "sinon": "^1.17.1", - "webpack": "^1.12.0", "xstream": "^5.0.5" }, "devEngines": { diff --git a/rollup.config.js b/rollup.config.js new file mode 100644 index 00000000..afce76ba --- /dev/null +++ b/rollup.config.js @@ -0,0 +1,57 @@ +const nodeResolve = require('rollup-plugin-node-resolve') +const babel = require('rollup-plugin-babel') +const replace = require('rollup-plugin-replace') +const commonjs = require('rollup-plugin-commonjs') + +module.exports = { + external: [ + 'react' + ], + globals: { + react: 'React' + }, + // Set library in release script + // moduleName: 'Recompose', + format: 'umd', + plugins: [ + nodeResolve({ + jsnext: true + }), + babel({ + exclude: 'node_modules/**', + babelrc: false, + plugins: [ + 'babel-plugin-transform-function-bind', + 'babel-plugin-transform-class-constructor-call', + ['babel-plugin-transform-class-properties', { loose: true }], + 'babel-plugin-transform-export-extensions', + 'babel-plugin-syntax-trailing-function-commas', + 'babel-plugin-transform-object-rest-spread', + 'babel-plugin-transform-async-to-generator', + + 'babel-plugin-transform-react-jsx', + 'babel-plugin-syntax-jsx', + 'babel-plugin-transform-react-display-name', + + ['babel-plugin-transform-es2015-template-literals', { loose: true }], + 'babel-plugin-transform-es2015-literals', + 'babel-plugin-transform-es2015-function-name', + 'babel-plugin-transform-es2015-arrow-functions', + 'babel-plugin-transform-es2015-block-scoped-functions', + ['babel-plugin-transform-es2015-classes', { loose: true }], + 'babel-plugin-transform-es2015-shorthand-properties', + ['babel-plugin-transform-es2015-computed-properties', { loose: true }], + ['babel-plugin-transform-es2015-spread', { loose: true }], + 'babel-plugin-transform-es2015-parameters', + ['babel-plugin-transform-es2015-destructuring', { loose: true }], + 'babel-plugin-transform-es2015-block-scoping', + 'babel-plugin-transform-regenerator', + 'babel-plugin-external-helpers' + ] + }), + commonjs(), + replace({ + 'process.env.NODE_ENV': JSON.stringify('production') + }) + ] +} diff --git a/scripts/getPackageNames.js b/scripts/getPackageNames.js index cbc9ec25..d78f890b 100644 --- a/scripts/getPackageNames.js +++ b/scripts/getPackageNames.js @@ -1,15 +1,15 @@ -import fs from 'fs' -import path from 'path' +const fs = require('fs') +const path = require('path') -export const PACKAGES_SRC_DIR = './src/packages' -export const PACKAGES_OUT_DIR = './lib/packages' +exports.PACKAGES_SRC_DIR = './src/packages' +exports.PACKAGES_OUT_DIR = './lib/packages' let names -export const getPackageNames = () => { +exports.getPackageNames = () => { if (!names) { - names = fs.readdirSync(PACKAGES_SRC_DIR).filter( - file => fs.statSync(path.resolve(PACKAGES_SRC_DIR, file)).isDirectory() + names = fs.readdirSync(exports.PACKAGES_SRC_DIR).filter(file => + fs.statSync(path.resolve(exports.PACKAGES_SRC_DIR, file)).isDirectory() ) } return names diff --git a/scripts/installNestedPackageDeps.js b/scripts/installNestedPackageDeps.js index a73e96a7..f9fe3461 100644 --- a/scripts/installNestedPackageDeps.js +++ b/scripts/installNestedPackageDeps.js @@ -1,6 +1,6 @@ -import path from 'path' -import { exec } from 'shelljs' -import { getPackageNames, PACKAGES_SRC_DIR } from './getPackageNames.js' +const path = require('path') +const { exec } = require('shelljs') +const { getPackageNames, PACKAGES_SRC_DIR } = require('./getPackageNames.js') const packageNames = getPackageNames() diff --git a/scripts/release.js b/scripts/release.js index 6e81b232..5e12bcf6 100644 --- a/scripts/release.js +++ b/scripts/release.js @@ -1,22 +1,23 @@ -import fs from 'fs' -import path from 'path' -import { exec, exit, rm, cp, test } from 'shelljs' -import chalk from 'chalk' -import { flowRight as compose } from 'lodash' -import readline from 'readline-sync' -import semver from 'semver' -import glob from 'glob' -import { pascalCase } from 'change-case' -import webpack from 'webpack' -import webpackBaseConfig from '../webpack.config' +const fs = require('fs') +const path = require('path') +const { exec, exit, rm, cp, test } = require('shelljs') +const chalk = require('chalk') +const { flowRight: compose } = require('lodash') +const readline = require('readline-sync') +const semver = require('semver') +const glob = require('glob') +const { pascalCase } = require('change-case') +const { rollup } = require('rollup') +const uglify = require('rollup-plugin-uglify') +const rollupBaseConfig = require('../rollup.config') const BIN = './node_modules/.bin' -import { +const { PACKAGES_SRC_DIR, PACKAGES_OUT_DIR, getPackageNames -} from './getPackageNames' +} = require('./getPackageNames') const BASE_PACKAGE_LOC = '../src/basePackage.json' @@ -61,8 +62,8 @@ const run = async () => { (semver.valid(nextVersion) && semver.gt(nextVersion, version)) )) { nextVersion = readline.question( - `Must provide a valid version that is greater than ${version}, ` - + `or leave blank to skip: ` + `Must provide a valid version that is greater than ${version}, ` + + `or leave blank to skip: ` ) } @@ -89,7 +90,10 @@ const run = async () => { ignore: `${sourceDir}/node_modules/**/*.js` }).map(to => path.relative(sourceDir, to)) - exec(`cd ${sourceDir} && ${path.resolve(BIN)}/babel ${sourceFiles.join(' ')} --out-dir ${path.resolve(outDir)}`) + exec( + `cd ${sourceDir} && ${path.resolve(BIN)}/babel ${sourceFiles.join(' ')} ` + + `--out-dir ${path.resolve(outDir)}` + ) log('Copying additional project files...') const additionalProjectFiles = [ @@ -110,7 +114,7 @@ const run = async () => { version: nextVersion, ...require(BASE_PACKAGE_LOC), ...require(path.resolve(sourceDir, 'package.json')), - private: undefined, + private: undefined } writeFile( @@ -118,44 +122,25 @@ const run = async () => { JSON.stringify(packageConfig, null, 2) ) - const buildWebpack = config => { - return new Promise((resolve, reject) => { - log(`Building ${config.output.filename}...`) - webpack(config, (err, stats) => { - if (err) { - return reject(err) - } - // log(`${config.output.filename} is ${stats.chunks[0].size}`) - writeFile( - path.resolve(outDir, `build/${config.output.filename}.stats.json`), - JSON.stringify(stats.toJson()) - ) - resolve() - }) - }) + const buildRollup = config => { + log(`Building ${config.dest}...`) + return rollup(config).then(bundle => bundle.write(config)) } const libraryName = pascalCase(packageName) - const webpackConfig = { - ...webpackBaseConfig, - entry: [path.resolve(sourceDir, 'index.js')], - output: { - ...webpackBaseConfig.output, - library: libraryName, - path: `${outDir}/build`, - filename: `${libraryName}.js` - } + const rollupConfig = { + ...rollupBaseConfig, + entry: path.resolve(sourceDir, 'index.js'), + moduleName: libraryName, + dest: `${outDir}/build/${libraryName}.js` } - const webpackMinConfig = { - ...webpackConfig, - output: { - ...webpackConfig.output, - filename: `${libraryName}.min.js` - }, + const rollupMinConfig = { + ...rollupConfig, + dest: `${outDir}/build/${libraryName}.min.js`, plugins: [ - ...webpackConfig.plugins, - new webpack.optimize.UglifyJsPlugin({ - compressor: { + ...rollupConfig.plugins, + uglify({ + compress: { pure_getters: true, unsafe: true, unsafe_comps: true, @@ -167,8 +152,8 @@ const run = async () => { } await Promise.all([ - buildWebpack(webpackConfig), - buildWebpack(webpackMinConfig), + buildRollup(rollupConfig), + buildRollup(rollupMinConfig) ]) log(`About to publish ${packageName}@${nextVersion} to npm.`) diff --git a/webpack.config.js b/webpack.config.js deleted file mode 100644 index 0bdf61fa..00000000 --- a/webpack.config.js +++ /dev/null @@ -1,35 +0,0 @@ -'use strict' - -var webpack = require('webpack') - -var reactExternal = { - root: 'React', - commonjs2: 'react', - commonjs: 'react', - amd: 'react' -} - -module.exports = { - externals: { - 'react': reactExternal - }, - module: { - loaders: [ - { test: /\.js$/, loaders: ['babel-loader'], exclude: /node_modules/ } - ] - }, - output: { - // Set library in release script - // library: 'Recompose', - libraryTarget: 'umd' - }, - resolve: { - extensions: ['', '.js'] - }, - plugins: [ - new webpack.optimize.OccurenceOrderPlugin(), - new webpack.DefinePlugin({ - 'process.env.NODE_ENV': JSON.stringify('production') - }) - ] -}