1 | const path = require("path");
|
2 | const rollup = require("rollup");
|
3 |
|
4 | module.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 |
|
11 | external: [],
|
12 | plugins: [],
|
13 |
|
14 | cache: null,
|
15 | inlineDynamicImports: false,
|
16 | manualChunks: null,
|
17 | onwarn: null,
|
18 | preserveModules: false,
|
19 | strictDeprecations: false,
|
20 |
|
21 | acorn: null,
|
22 | acornInjectPlugins: null,
|
23 | context: null,
|
24 | moduleContext: null,
|
25 | preserveSymlinks: false,
|
26 | shimMissingExports: false,
|
27 | treeshake: true,
|
28 |
|
29 | format: "es",
|
30 | globals: {},
|
31 | name: null,
|
32 |
|
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 |
|
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 | };
|