UNPKG

4.22 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 resolve = 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');
18var postcss = require('rollup-plugin-postcss');
19var json = require('@rollup/plugin-json');
20
21const defaultFormat = 'esm';
22const dirMap = {
23 umd: 'dist-umd',
24 cjs: 'dist-node',
25 esm: 'dist-web',
26}
27const fieldMap = {
28 esm: 'module',
29 cjs: 'main',
30 umd: 'umd:main',
31};
32function manifest(manifest, { options }) {
33 const format = options.format || defaultFormat;
34 const dist = `${dirMap[format]}/index.js`;
35 const field = fieldMap[format];
36 manifest[field] = manifest[field] || dist;
37}
38
39const defaultExtensions = ['.ts', '.tsx', '.jsx', '.js'];
40
41async function build({
42 out,
43 cwd,
44 options,
45 reporter
46}) {
47 const format = options.format || defaultFormat;
48 const dist = `${dirMap[format]}/index.js`;
49 const writeToWeb = path.join(out, dist);
50 const extensions = options.extensions || defaultExtensions;
51 const babel = options.babel || {};
52 const runtimeHelpers = options.runtimeHelpers || undefined;
53 const src = path.join(cwd, 'src');
54 let input = path.join(src, 'index');
55
56 const isTs = (fs.existsSync(input + '.ts') || fs.existsSync(input + '.tsx'));
57 const plugins = [
58 json(),
59 postcss({
60 extract: options.extractCSS,
61 plugins: []
62 }),
63
64 workerPlugin({
65 pattern: /^.+\.worker$/,
66 extensions,
67 }),
68
69 resolve({
70 browser: true,
71 extensions,
72 }),
73
74 rollupBabel({
75 exclude: 'node_modules/**',
76 extensions,
77 runtimeHelpers,
78 ...(options.envName ? { envName: options.envName } : {}),
79 ...babel,
80 })
81 ];
82
83 plugins.push(commonjs());
84
85 if (options.terser) {
86 plugins.push(terser());
87 }
88
89 let matchPath;
90 if (isTs) {
91 const loadResult = TsconfigPaths.loadConfig(cwd);
92 if (loadResult && loadResult.resultType !== 'failed') {
93 matchPath = TsconfigPaths.createMatchPath(
94 loadResult.absoluteBaseUrl,
95 loadResult.paths,
96 ['main', 'module']
97 );
98 plugins.push({
99 name: 'rollup-plugin-ts-paths',
100 resolveId(s) {
101 let ret = matchPath(s, TsconfigPaths.ReadJsonSync, TsconfigPaths.FileExistsSync, extensions);
102 for (e of extensions) {
103 if (fs.existsSync(`${ret}${e}`)) {
104 ret = `${ret}${e}`;
105 break;
106 }
107 }
108 return ret;
109 }
110 });
111 }
112 }
113
114 let external;
115
116 if (format === 'umd') {
117 external = options.external || ['react', 'react-dom'];
118 }
119
120 const result = await rollup.rollup({
121 input,
122
123 external: external || function (s) {
124 const isLocal = (s.startsWith('/') || s.startsWith('./') || s.startsWith('../'));
125 if (isLocal) {
126 return false;
127 }
128 if (s === 'rollup-plugin-web-worker-loader::helper') {
129 return false;
130 }
131 if (matchPath) {
132 let ret;
133 ret = matchPath(s, TsconfigPaths.ReadJsonSync, TsconfigPaths.FileExistsSync, extensions);
134 if (ret) {
135 return false;
136 }
137 }
138 return true;
139 },
140 plugins,
141 onwarn: (warning, defaultOnWarnHandler) => {
142 // // Unresolved external imports are expected
143 if (warning.code === 'UNRESOLVED_IMPORT' && !(warning.source.startsWith('./') || warning.source.startsWith('../'))) {
144 return;
145 }
146
147 defaultOnWarnHandler(warning);
148 }
149 });
150 let output = {};
151 if (format === 'umd') {
152 output = {
153 name: options.name,
154 globals: options.globals || {
155 react: 'React',
156 'react-dom': 'ReactDOM',
157 },
158 };
159 }
160 await result.write({
161 file: writeToWeb,
162 format,
163 output,
164 exports: 'named',
165 sourcemap: options.sourcemap === undefined ? true : options.sourcemap
166 });
167 reporter.created(writeToWeb, 'module');
168}
169
170
171exports.build = build;
172exports.manifest = manifest;