UNPKG

jmd-scripts

Version:

CLI for common scripts for my projects

150 lines (122 loc) 5.39 kB
"use strict"; function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; var ownKeys = Object.keys(source); if (typeof Object.getOwnPropertySymbols === 'function') { ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) { return Object.getOwnPropertyDescriptor(source, sym).enumerable; })); } ownKeys.forEach(function (key) { _defineProperty(target, key, source[key]); }); } return target; } function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } const path = require('path'); const glob = require('glob'); const camelcase = require('lodash.camelcase'); const rollupBabel = require('rollup-plugin-babel'); const commonjs = require('rollup-plugin-commonjs'); const nodeResolve = require('rollup-plugin-node-resolve'); const json = require('rollup-plugin-json'); const replace = require('rollup-plugin-replace'); const { terser } = require('rollup-plugin-terser'); const nodeBuiltIns = require('rollup-plugin-node-builtins'); const nodeGlobals = require('rollup-plugin-node-globals'); const { sizeSnapshot } = require('rollup-plugin-size-snapshot'); const omit = require('lodash.omit'); const { pkg, hasFile, hasPkgProp, parseEnv, ifFile, fromRoot, uniq, writeExtraEntry } = require('../utils'); const here = p => path.join(__dirname, p); const capitalize = s => s[0].toUpperCase() + s.slice(1); const minify = parseEnv('BUILD_MINIFY', false); const format = process.env.BUILD_FORMAT; const isPreact = parseEnv('BUILD_PREACT', false); const isNode = parseEnv('BUILD_NODE', false); const name = process.env.BUILD_NAME || capitalize(camelcase(pkg.name)); const useSizeSnapshot = parseEnv('BUILD_SIZE_SNAPSHOT', false); const esm = format === 'esm'; const umd = format === 'umd'; const defaultGlobals = Object.keys(pkg.peerDependencies || {}).reduce((deps, dep) => { deps[dep] = capitalize(camelcase(dep)); return deps; }, {}); const deps = Object.keys(pkg.dependencies || {}); const peerDeps = Object.keys(pkg.peerDependencies || {}); const defaultExternal = umd ? peerDeps : deps.concat(peerDeps); const input = glob.sync(fromRoot(process.env.BUILD_INPUT || ifFile(`src/${format}-entry.js`, `src/${format}-entry.js`, 'src/index.js'))); const codeSplitting = input.length > 1; if (codeSplitting && uniq(input.map(single => path.basename(single))).length !== input.length) { throw new Error('Filenames of code-splitted entries should be unique to get deterministic output filenames.' + `\nReceived those: ${input}.`); } const filenameSuffix = process.env.BUILD_FILENAME_SUFFIX || ''; const filenamePrefix = process.env.BUILD_FILENAME_PREFIX || (isPreact ? 'preact/' : ''); const globals = parseEnv('BUILD_GLOBALS', isPreact ? Object.assign(defaultGlobals, { preact: 'preact' }) : defaultGlobals); const external = parseEnv('BUILD_EXTERNAL', isPreact ? defaultExternal.concat(['preact', 'prop-types']) : defaultExternal).filter((e, i, arry) => arry.indexOf(e) === i); if (isPreact) { delete globals.react; delete globals['prop-types']; // TODO: is this necessary? external.splice(external.indexOf('react'), 1); } const externalPattern = new RegExp(`^(${external.join('|')})($|/)`); const externalPredicate = external.length === 0 ? () => false : id => externalPattern.test(id); const filename = [pkg.name, filenameSuffix, `.${format}`, minify ? '.min' : null, '.js'].filter(Boolean).join(''); const dirpath = path.join(...[filenamePrefix, 'dist'].filter(Boolean)); const output = [_objectSpread({ name }, codeSplitting ? { dir: path.join(dirpath, format) } : { file: path.join(dirpath, filename) }, { format: esm ? 'es' : format, exports: esm ? 'named' : 'auto', globals })]; const useBuiltinConfig = !hasFile('.babelrc') && !hasPkgProp('babel'); const babelPresets = useBuiltinConfig ? [here('../config/babelrc.js')] : []; const replacements = Object.entries(umd ? process.env : omit(process.env, ['NODE_ENV'])).reduce((acc, [key, value]) => { let val; if (value === 'true' || value === 'false' || Number.isInteger(+value)) { val = value; } else { val = JSON.stringify(value); } acc[`process.env.${key}`] = val; return acc; }, {}); module.exports = { input: codeSplitting ? input : input[0], output, experimentalCodeSplitting: codeSplitting, external: externalPredicate, plugins: [isNode ? nodeBuiltIns() : null, isNode ? nodeGlobals() : null, nodeResolve({ preferBuiltins: isNode, jsnext: true, main: true }), commonjs({ include: 'node_modules/**' }), json(), rollupBabel({ exclude: 'node_modules/**', presets: babelPresets, babelrc: true }), replace(replacements), useSizeSnapshot ? sizeSnapshot({ printInfo: false }) : null, minify ? terser() : null, codeSplitting && ((writes = 0) => ({ onwrite() { if (++writes !== input.length) { return; } input.filter(single => single.indexOf('index.js') === -1).forEach(single => { const chunk = path.basename(single); writeExtraEntry(chunk.replace(/\..+$/, ''), { cjs: `${dirpath}/cjs/${chunk}`, esm: `${dirpath}/esm/${chunk}` }); }); } }))()].filter(Boolean) };