UNPKG

5.25 kBJavaScriptView Raw
1"use strict";
2
3var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
5var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
6
7const path = require('path');
8
9const replace = require('@rollup/plugin-replace');
10
11const glob = require('glob');
12
13const camelcase = require('lodash.camelcase');
14
15const rollupBabel = require('rollup-plugin-babel');
16
17const commonjs = require('rollup-plugin-commonjs');
18
19const nodeResolve = require('rollup-plugin-node-resolve');
20
21const json = require('rollup-plugin-json');
22
23const {
24 terser
25} = require('rollup-plugin-terser');
26
27const nodeBuiltIns = require('rollup-plugin-node-builtins');
28
29const nodeGlobals = require('rollup-plugin-node-globals');
30
31const {
32 sizeSnapshot
33} = require('rollup-plugin-size-snapshot');
34
35const omit = require('lodash.omit');
36
37const {
38 pkg,
39 hasFile,
40 hasPkgProp,
41 parseEnv,
42 fromRoot,
43 uniq,
44 writeExtraEntry
45} = require('../utils');
46
47const here = p => path.join(__dirname, p);
48
49const capitalize = s => s[0].toUpperCase() + s.slice(1);
50
51const minify = parseEnv('BUILD_MINIFY', false);
52const format = process.env.BUILD_FORMAT;
53const isPreact = parseEnv('BUILD_PREACT', false);
54const isNode = parseEnv('BUILD_NODE', false);
55const name = process.env.BUILD_NAME || capitalize(camelcase(pkg.name));
56const useSizeSnapshot = parseEnv('BUILD_SIZE_SNAPSHOT', false);
57const esm = format === 'esm';
58const umd = format === 'umd';
59const defaultGlobals = Object.keys(pkg.peerDependencies || {}).reduce((deps, dep) => {
60 deps[dep] = capitalize(camelcase(dep));
61 return deps;
62}, {});
63const deps = Object.keys(pkg.dependencies || {});
64const peerDeps = Object.keys(pkg.peerDependencies || {});
65const defaultExternal = umd ? peerDeps : deps.concat(peerDeps);
66const input = glob.sync(fromRoot(process.env.BUILD_INPUT || 'src/index.js'));
67const codeSplitting = input.length > 1;
68
69if (codeSplitting && uniq(input.map(single => path.basename(single))).length !== input.length) {
70 throw new Error('Filenames of code-splitted entries should be unique to get deterministic output filenames.' + `\nReceived those: ${input}.`);
71}
72
73const filenameSuffix = process.env.BUILD_FILENAME_SUFFIX || '';
74const filenamePrefix = process.env.BUILD_FILENAME_PREFIX || (isPreact ? 'preact/' : '');
75const globals = parseEnv('BUILD_GLOBALS', isPreact ? Object.assign(defaultGlobals, {
76 preact: 'preact'
77}) : defaultGlobals);
78const external = parseEnv('BUILD_EXTERNAL', isPreact ? defaultExternal.concat(['preact', 'prop-types']) : defaultExternal).filter((e, i, arry) => arry.indexOf(e) === i);
79
80if (isPreact) {
81 delete globals.react;
82 delete globals['prop-types']; // TODO: is this necessary?
83
84 external.splice(external.indexOf('react'), 1);
85}
86
87const externalPattern = new RegExp(`^(${external.join('|')})($|/)`);
88
89function externalPredicate(id) {
90 const isDep = external.length > 0 && externalPattern.test(id);
91
92 if (umd) {
93 // for UMD, we want to bundle all non-peer deps
94 return isDep;
95 } // for esm/cjs we want to make all node_modules external
96 // TODO: support bundledDependencies if someone needs it ever...
97
98
99 const isNodeModule = id.includes('node_modules');
100 const isRelative = id.startsWith('.');
101 return isDep || !isRelative && !path.isAbsolute(id) || isNodeModule;
102}
103
104const filename = [pkg.name, filenameSuffix, `.${format}`, minify ? '.min' : null, '.js'].filter(Boolean).join('');
105const dirpath = path.join(...[filenamePrefix, 'dist'].filter(Boolean));
106const output = [(0, _extends2.default)({
107 name
108}, codeSplitting ? {
109 dir: path.join(dirpath, format)
110} : {
111 file: path.join(dirpath, filename)
112}, {
113 format: esm ? 'es' : format,
114 exports: esm ? 'named' : 'auto',
115 globals
116})];
117const useBuiltinConfig = !hasFile('.babelrc') && !hasFile('.babelrc.js') && !hasFile('babel.config.js') && !hasPkgProp('babel');
118const babelPresets = useBuiltinConfig ? [here('../config/babelrc.js')] : [];
119const replacements = Object.entries(umd ? process.env : omit(process.env, ['NODE_ENV'])).reduce((acc, [key, value]) => {
120 let val;
121
122 if (value === 'true' || value === 'false' || Number.isInteger(+value)) {
123 val = value;
124 } else {
125 val = JSON.stringify(value);
126 }
127
128 acc[`process.env.${key}`] = val;
129 return acc;
130}, {});
131module.exports = {
132 input: codeSplitting ? input : input[0],
133 output,
134 external: externalPredicate,
135 plugins: [isNode ? nodeBuiltIns() : null, isNode ? nodeGlobals() : null, nodeResolve({
136 preferBuiltins: isNode,
137 mainFields: ['module', 'main', 'jsnext', 'browser']
138 }), commonjs({
139 include: 'node_modules/**'
140 }), json(), rollupBabel({
141 presets: babelPresets,
142 babelrc: !useBuiltinConfig,
143 runtimeHelpers: useBuiltinConfig
144 }), replace(replacements), useSizeSnapshot ? sizeSnapshot({
145 printInfo: false
146 }) : null, minify ? terser() : null, codeSplitting && ((writes = 0) => ({
147 onwrite() {
148 if (++writes !== input.length) {
149 return;
150 }
151
152 input.filter(single => single.indexOf('index.js') === -1).forEach(single => {
153 const chunk = path.basename(single);
154 writeExtraEntry(chunk.replace(/\..+$/, ''), {
155 cjs: `${dirpath}/cjs/${chunk}`,
156 esm: `${dirpath}/esm/${chunk}`
157 });
158 });
159 }
160
161 }))()].filter(Boolean)
162};
\No newline at end of file