UNPKG

4.89 kBJavaScriptView Raw
1var path = (require('path'));
2var types;
3try {
4 types = require('@pika/types');
5} catch (e) {
6 types = {
7 MessageError: Error,
8 };
9}
10var rollup = require('rollup');
11var rollupBabel = (require('rollup-plugin-babel'));
12var commonjs = (require('@rollup/plugin-commonjs'));
13var { nodeResolve } = require('@rollup/plugin-node-resolve');
14var fs = require('fs');
15var TsconfigPaths = require('tsconfig-paths');
16var { terser } = require("rollup-plugin-terser");
17var workerPlugin = require('./worker-plugin');
18
19var postcss;
20
21try {
22 postcss = require('rollup-plugin-postcss');
23} catch (e) { }
24
25var json = require('@rollup/plugin-json');
26var replace = require('@rollup/plugin-replace')
27const defaultFormat = 'esm';
28const dirMap = {
29 umd: 'dist-umd',
30 cjs: 'dist-node',
31 esm: 'dist-web',
32}
33const fieldMap = {
34 esm: 'module',
35 cjs: 'main',
36 umd: 'umd:main',
37};
38function manifest(manifest, { options }) {
39 const format = options.format || defaultFormat;
40 const dist = `${dirMap[format]}/index.${options.mjs ? 'mjs' : 'js'}`;
41 const field = fieldMap[format];
42 manifest[field] = manifest[field] || dist;
43}
44
45const defaultExtensions = ['.ts', '.tsx', '.jsx', '.js'];
46
47async function build({
48 out,
49 cwd,
50 options,
51 reporter
52}) {
53 const format = options.format || defaultFormat;
54 const dist = `${dirMap[format]}/index.${options.mjs ? 'mjs' : 'js'}`;
55 const writeToWeb = path.join(out, dist);
56 const extensions = options.extensions || defaultExtensions;
57 const babel = options.babel || {};
58 const preserveModules = options.preserveModules || false;
59 const runtimeHelpers = options.runtimeHelpers || undefined;
60 const src = path.join(cwd, 'src');
61 let input = path.join(src, 'index');
62
63 const isTs = (fs.existsSync(input + '.ts') || fs.existsSync(input + '.tsx'));
64 const plugins = [
65 json(),
66
67 postcss && postcss({
68 extract: options.extractCSS,
69 plugins: []
70 }),
71
72 workerPlugin({
73 pattern: /^.+\.worker$/,
74 extensions,
75 }),
76
77 nodeResolve({
78 browser: true,
79 extensions,
80 }),
81
82 rollupBabel({
83 exclude: 'node_modules/**',
84 extensions,
85 runtimeHelpers,
86 ...(options.envName ? { envName: options.envName } : {}),
87 ...babel,
88 })
89 ].filter(Boolean);
90
91 plugins.push(commonjs());
92
93 if (options.minimize) {
94 plugins.push(terser());
95 }
96
97 let matchPath;
98 if (isTs) {
99 const loadResult = TsconfigPaths.loadConfig(cwd);
100 if (loadResult && loadResult.resultType !== 'failed') {
101 matchPath = TsconfigPaths.createMatchPath(
102 loadResult.absoluteBaseUrl,
103 loadResult.paths,
104 ['main', 'module']
105 );
106 plugins.push({
107 name: 'rollup-plugin-ts-paths',
108 resolveId(s) {
109 let ret = matchPath(s, TsconfigPaths.ReadJsonSync, TsconfigPaths.FileExistsSync, extensions);
110 for (e of extensions) {
111 if (fs.existsSync(`${ret}${e}`)) {
112 ret = `${ret}${e}`;
113 break;
114 }
115 }
116 return ret;
117 }
118 });
119 }
120 }
121
122 let external;
123
124 if (format === 'umd') {
125 external = options.external || ['react', 'react-dom'];
126 plugins.push(replace({
127 "process.env.NODE_ENV": "'production'"
128 }))
129 }
130 const result = await rollup.rollup({
131 input,
132
133 preserveModules,
134
135 external: external || function (s, p, r) {
136 const isLocal = (s.startsWith('/') || s.startsWith('./') || s.startsWith('../'));
137 if (isLocal) {
138 return false;
139 }
140 if (s === 'rollup-plugin-web-worker-loader::helper') {
141 return false;
142 }
143 if (matchPath) {
144 let ret;
145 ret = matchPath(s, TsconfigPaths.ReadJsonSync, TsconfigPaths.FileExistsSync, extensions);
146 if (ret) {
147 return false;
148 }
149 }
150
151 if (r) {
152 const pathNames = s.split(path.sep);
153 if (!pathNames.includes('node_modules')) {
154 return false;
155 }
156 }
157
158 return true;
159 },
160 plugins,
161 onwarn: (warning, defaultOnWarnHandler) => {
162 // // Unresolved external imports are expected
163 if (warning.code === 'UNRESOLVED_IMPORT' && !(warning.source.startsWith('./') || warning.source.startsWith('../'))) {
164 return;
165 }
166
167 defaultOnWarnHandler(warning);
168 }
169 });
170 let output = {
171 dir: path.dirname(writeToWeb),
172 };
173 if (format === 'umd') {
174 output = {
175 ...output,
176 name: options.name,
177 globals: options.globals || {
178 react: 'React',
179 'react-dom': 'ReactDOM',
180 },
181 };
182 }
183 const config = {
184 file: writeToWeb,
185 format,
186 ...output,
187 exports: 'named',
188 sourcemap: options.sourcemap === undefined ? true : options.sourcemap
189 };
190 if (preserveModules) {
191 delete config.file;
192 } else {
193 delete config.dir;
194 }
195
196 await result.write(config);
197 reporter.created(writeToWeb, 'module');
198}
199
200
201exports.build = build;
202exports.manifest = manifest;