1 | "use strict";
|
2 |
|
3 | const babel = require("babel-core");
|
4 | const babiliPreset = require("babel-preset-babili");
|
5 | const {SourceMapSource, RawSource} = require("webpack-sources");
|
6 |
|
7 | module.exports = class BabiliPlugin {
|
8 | constructor(options = {}) {
|
9 | this.options = options;
|
10 | }
|
11 |
|
12 | apply(compiler) {
|
13 | const options = this.options;
|
14 |
|
15 | const jsregex = options.test || /\.js($|\?)/i;
|
16 | const commentsRegex = typeof options.comments === "undefined"
|
17 | ? /@preserve|@licen(s|c)e/
|
18 | : options.comments;
|
19 |
|
20 | const useSourceMap = typeof options.sourceMap === "undefined"
|
21 | ? !!compiler.options.devtool
|
22 | : options.sourceMap;
|
23 |
|
24 | const _babel = this.options.babel || babel;
|
25 | const _babili = this.options.babili || babiliPreset;
|
26 |
|
27 | compiler.plugin("compilation", function (compilation) {
|
28 | if (useSourceMap) {
|
29 | compilation.plugin("build-module", function (module) {
|
30 | module.useSourceMap = true;
|
31 | });
|
32 | }
|
33 |
|
34 | compilation.plugin("optimize-chunk-assets", function (chunks, callback) {
|
35 | const files = [];
|
36 |
|
37 | chunks.forEach(chunk => {
|
38 | chunk.files.forEach(file => files.push(file));
|
39 | });
|
40 |
|
41 | compilation.additionalChunkAssets.forEach(file => files.push(file));
|
42 |
|
43 | files
|
44 | .filter(file => jsregex.test(file))
|
45 | .forEach(file => {
|
46 | try {
|
47 | let asset = compilation.assets[file];
|
48 |
|
49 | if (asset.__babilified) {
|
50 | compilation.assets[file] = asset.__babilified;
|
51 | return;
|
52 | }
|
53 |
|
54 | let input, inputSourceMap;
|
55 |
|
56 | if (useSourceMap) {
|
57 | if (asset.sourceAndMap) {
|
58 | let sourceAndMap = asset.sourceAndMap();
|
59 | inputSourceMap = sourceAndMap.map;
|
60 | input = sourceAndMap.source;
|
61 | } else {
|
62 | inputSourceMap = asset.map();
|
63 | input = asset.source();
|
64 | }
|
65 | } else {
|
66 | input = asset.source();
|
67 | }
|
68 |
|
69 |
|
70 | const result = _babel.transform(input, {
|
71 | presets: [_babili],
|
72 | sourceMaps: useSourceMap,
|
73 | babelrc: false,
|
74 | inputSourceMap,
|
75 | shouldPrintComment(contents) {
|
76 | return shouldPrintComment(contents, commentsRegex);
|
77 | }
|
78 | });
|
79 |
|
80 | asset.__babilified = compilation.assets[file] = (
|
81 | result.map
|
82 | ? new SourceMapSource(result.code, file, result.map, input, inputSourceMap)
|
83 | : new RawSource(result.code)
|
84 | );
|
85 | } catch (e) {
|
86 | compilation.errors.push(e);
|
87 | }
|
88 | });
|
89 |
|
90 | callback();
|
91 | });
|
92 | });
|
93 | }
|
94 | };
|
95 |
|
96 | function shouldPrintComment(contents, checker) {
|
97 | switch (typeof checker) {
|
98 | case "function": return checker(contents);
|
99 | case "object": return checker.test(contents);
|
100 | default: return !!checker;
|
101 | }
|
102 | }
|