UNPKG

4.63 kBJavaScriptView Raw
1import fs from 'fs';
2import path from 'path';
3import builtins from 'builtin-modules';
4import debug from 'debug';
5import { flatMap } from 'lodash';
6import { terser } from 'rollup-plugin-terser';
7import babel from 'rollup-plugin-babel';
8import commonjs from 'rollup-plugin-commonjs';
9import json from 'rollup-plugin-json';
10import replace from 'rollup-plugin-replace';
11import nodeResolve from 'rollup-plugin-node-resolve';
12import typescript from 'rollup-plugin-typescript';
13import { getGlobals, upperCamelCase, normalizePkg } from '@pkgr/umd-globals';
14import { namedExports } from '@pkgr/named-exports';
15
16var info = debug('r:info');
17var PRODUCTION = 'production';
18var BASIC_PLUGINS = [nodeResolve({
19 mainFields: ['esnext', 'es2015', 'esm2015', 'fesm2015', 'esm5', 'fesm5', 'module', 'main']
20}), commonjs({
21 namedExports
22}), json()];
23var DEFAULT_FORMATS = ['cjs', 'es2015', 'esm'];
24var isTsAvailable = false;
25
26try {
27 isTsAvailable = !!require.resolve('typescript');
28} catch (e) {} // eslint-disable-next-line node/no-deprecated-api
29
30
31var EXTENSIONS = Object.keys(require.extensions);
32
33if (isTsAvailable) {
34 EXTENSIONS.unshift('.ts', '.tsx');
35}
36
37var tryExtensions = filepath => {
38 var ext = EXTENSIONS.find(ext => fs.existsSync(filepath + ext));
39 return ext ? filepath + ext : filepath;
40};
41
42var configBase = function configBase() {
43 var {
44 formats,
45 monorepo,
46 input,
47 outputDir = 'lib',
48 exports,
49 externals = [],
50 globals: umdGlobals,
51 prod = process.env.NODE_ENV === PRODUCTION
52 } = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
53 var pkgsPath = path.resolve(typeof monorepo === 'string' ? monorepo : 'packages');
54
55 if (monorepo !== false) {
56 monorepo = fs.existsSync(pkgsPath);
57 }
58
59 var pkgs = monorepo ? fs.readdirSync(pkgsPath) : [''];
60 var globals = getGlobals({
61 globals: umdGlobals
62 });
63 var configs = flatMap(pkgs, pkg => {
64 var pkgPath = path.resolve(monorepo ? pkgsPath : '', pkg);
65 var srcPath = path.resolve(pkgPath, 'src');
66 var pkgInput = input;
67 var pkgOutputDir = outputDir;
68
69 if (!fs.existsSync(srcPath) && pkgInput == null) {
70 pkgInput = 'index';
71 }
72
73 pkgInput = tryExtensions(path.resolve(pkgPath, pkgInput || 'src/index'));
74 var isAbsolute = path.isAbsolute(pkgInput);
75
76 if (pkgOutputDir && !pkgOutputDir.endsWith('/')) {
77 pkgOutputDir = pkgOutputDir + '/';
78 }
79
80 if (!fs.existsSync(pkgInput) || isAbsolute && !pkgInput.startsWith(pkgPath)) {
81 return [];
82 }
83
84 var {
85 name,
86 engines: {
87 node
88 } = {},
89 dependencies = {},
90 peerDependencies = {}
91 } = require(path.resolve(pkgPath, 'package.json'));
92
93 var _external = externals.concat(Object.keys(peerDependencies), node ? Object.keys(dependencies).concat(builtins) : []);
94
95 var isTsInput = /\.tsx?/.test(pkgInput);
96 var pkgFormats = formats && formats.length ? formats : DEFAULT_FORMATS.concat(node ? [] : 'umd');
97
98 var pkgGlobals = _external.reduce((pkgGlobals, pkg) => {
99 if (pkgGlobals[pkg] == null) {
100 pkgGlobals[pkg] = upperCamelCase(normalizePkg(pkg));
101 }
102
103 return pkgGlobals;
104 }, globals);
105
106 return pkgFormats.map(format => {
107 var isEsVersion = /^es(\d+|next)$/.test(format) && format !== 'es5';
108 return {
109 input: pkgInput,
110 output: {
111 file: path.resolve(pkgPath, "".concat(pkgOutputDir).concat(format).concat(prod ? '.min' : '', ".js")),
112 format: isEsVersion ? 'esm' : format,
113 name: pkgGlobals[name] || upperCamelCase(normalizePkg(name)),
114 globals,
115 exports
116 },
117 external: id => _external.some(pkg => id === pkg || id.startsWith(pkg + '/')),
118 plugins: [isTsAvailable && isTsInput ? typescript({
119 target: isEsVersion ? format : 'es5'
120 }) : babel({
121 exclude: ['*.min.js', '*.production.js'],
122 presets: [['@babel/preset-env', isEsVersion ? {
123 targets: {
124 esmodules: true
125 }
126 } : undefined]]
127 })].concat(BASIC_PLUGINS, prod ? [replace({
128 'process.env.NODE_ENV': JSON.stringify(PRODUCTION)
129 }), terser()] : [])
130 };
131 });
132 });
133 console.assert(configs.length, "No configuration resolved, mark sure you've setup correctly");
134 return configs;
135};
136
137var config = (function () {
138 var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
139 var configs = configBase(options).concat(options.prod ? configBase(Object.assign({}, options, {
140 prod: false
141 })) : []);
142 info('configs: %O', configs);
143 return configs;
144});
145
146export default config;