UNPKG

3.01 kBJavaScriptView Raw
1"use strict";
2
3const babel = require("babel-core");
4const babiliPreset = require("babel-preset-babili");
5const {SourceMapSource, RawSource} = require("webpack-sources");
6
7module.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 // do the transformation
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
96function 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}