UNPKG

6.25 kBJavaScriptView Raw
1const path = require("path");
2const rollup = require("rollup");
3
4module.exports = (grunt) => {
5 grunt.registerMultiTask("rollup", "Grunt plugin for rollup - next-generation ES6 module bundler", () => {
6 const { current } = grunt.task;
7
8 const done = current.async();
9 const options = current.options({
10 // core input options
11 external: [],
12 plugins: [],
13 // advanced input options
14 cache: null,
15 inlineDynamicImports: false,
16 manualChunks: null,
17 onwarn: null,
18 preserveModules: false,
19 strictDeprecations: false,
20 // danger zone
21 acorn: null,
22 acornInjectPlugins: null,
23 context: null,
24 moduleContext: null,
25 preserveSymlinks: false,
26 shimMissingExports: false,
27 treeshake: true,
28 // core output options
29 format: "es",
30 globals: {},
31 name: null,
32 // advanced output options
33 assetFileNames: null,
34 banner: null,
35 chunkFileNames: null,
36 compact: false,
37 entryFileNames: null,
38 extend: false,
39 externalLiveBindings: true,
40 footer: null,
41 interop: true,
42 intro: null,
43 outro: null,
44 paths: null,
45 sourcemap: false,
46 sourcemapExcludeSources: false,
47 sourcemapFile: null,
48 sourcemapPathTransform: null,
49 // danger zone
50 amd: {
51 id: null,
52 define: null,
53 },
54 dynamicImportFunction: null,
55 esModule: true,
56 exports: "auto",
57 freeze: true,
58 indent: true,
59 namespaceToStringTag: false,
60 noConflict: false,
61 preferConst: false,
62 strict: true,
63 });
64
65 const promises = current.files.map((files) => {
66 let { plugins } = options;
67 if (typeof plugins === "function") {
68 plugins = plugins();
69 }
70
71 const inputOptions = (({
72 external,
73 cache,
74 inlineDynamicImports,
75 manualChunks,
76 onwarn,
77 preserveModules,
78 strictDeprecations,
79 acorn,
80 acornInjectPlugins,
81 context,
82 moduleContext,
83 preserveSymlinks,
84 shimMissingExports,
85 treeshake,
86 }) => ({
87 external,
88 cache,
89 inlineDynamicImports,
90 manualChunks,
91 onwarn,
92 preserveModules,
93 strictDeprecations,
94 acorn,
95 acornInjectPlugins,
96 context,
97 moduleContext,
98 preserveSymlinks,
99 shimMissingExports,
100 treeshake,
101 }))(options);
102 const outputOptions = (({
103 format,
104 globals,
105 name,
106 assetFileNames,
107 banner,
108 chunkFileNames,
109 compact,
110 entryFileNames,
111 extend,
112 externalLiveBindings,
113 footer,
114 interop,
115 intro,
116 outro,
117 paths,
118 sourcemap,
119 sourcemapExcludeSources,
120 sourcemapFile,
121 sourcemapPathTransform,
122 amd,
123 dynamicImportFunction,
124 esModule,
125 exports,
126 freeze,
127 indent,
128 namespaceToStringTag,
129 noConflict,
130 preferConst,
131 strict,
132 }) => ({
133 format,
134 globals,
135 name,
136 assetFileNames,
137 banner,
138 chunkFileNames,
139 compact,
140 entryFileNames,
141 extend,
142 externalLiveBindings,
143 footer,
144 interop,
145 intro,
146 outro,
147 paths,
148 sourcemap,
149 sourcemapExcludeSources,
150 sourcemapFile,
151 sourcemapPathTransform,
152 amd,
153 dynamicImportFunction,
154 esModule,
155 exports,
156 freeze,
157 indent,
158 namespaceToStringTag,
159 noConflict,
160 preferConst,
161 strict,
162 }))(options);
163
164 const isMultipleInput = Array.isArray(files.src) && files.src.length > 1;
165
166 return rollup
167 .rollup({
168 ...inputOptions,
169 input: files.src,
170 plugins,
171 })
172 .then(bundle => bundle.generate({
173 ...outputOptions,
174 [isMultipleInput ? "dir" : "files"]: files.dest,
175 }))
176 .then(result => result.output.forEach((output) => {
177 let { code } = output;
178 const dest = isMultipleInput ? path.join(files.dest, output.fileName) : files.dest;
179 const dir = path.dirname(dest);
180
181 if (outputOptions.sourcemap === true) {
182 const sourceMapOutPath = outputOptions.sourcemapFile || `${dest}.map`;
183 grunt.file.write(sourceMapOutPath, String(output.map));
184 code += `\n//# sourceMappingURL=${path.relative(dir, sourceMapOutPath)}`;
185 }
186 else if (outputOptions.sourcemap === "inline") {
187 code += `\n//# sourceMappingURL=${output.map.toUrl()}`;
188 }
189
190 grunt.file.write(dest, code);
191 }));
192 });
193
194 Promise
195 .all(promises)
196 .then(done)
197 .catch(error => grunt.fail.warn(error));
198 });
199};