UNPKG

7.9 kBJavaScriptView Raw
1'use strict';
2
3Object.defineProperty(exports, "__esModule", {
4 value: true
5});
6exports.default = BabelMinify;
7
8var _babelCore = require('babel-core');
9
10var _babelPluginTransformMangle = require('babel-plugin-transform-mangle');
11
12var _babelPluginTransformMangle2 = _interopRequireDefault(_babelPluginTransformMangle);
13
14var _babelPluginTransformEvaluate = require('babel-plugin-transform-evaluate');
15
16var _babelPluginTransformEvaluate2 = _interopRequireDefault(_babelPluginTransformEvaluate);
17
18var _babelPluginTransformConditionals = require('babel-plugin-transform-conditionals');
19
20var _babelPluginTransformConditionals2 = _interopRequireDefault(_babelPluginTransformConditionals);
21
22var _babelPluginTransformRemoveDebugger = require('babel-plugin-transform-remove-debugger');
23
24var _babelPluginTransformRemoveDebugger2 = _interopRequireDefault(_babelPluginTransformRemoveDebugger);
25
26var _babelPluginTransformRemoveConsole = require('babel-plugin-transform-remove-console');
27
28var _babelPluginTransformRemoveConsole2 = _interopRequireDefault(_babelPluginTransformRemoveConsole);
29
30var _babelPluginTransformDeadCodeElimination = require('babel-plugin-transform-dead-code-elimination');
31
32var _babelPluginTransformDeadCodeElimination2 = _interopRequireDefault(_babelPluginTransformDeadCodeElimination);
33
34var _babelPluginTransformMemberExpressionLiterals = require('babel-plugin-transform-member-expression-literals');
35
36var _babelPluginTransformMemberExpressionLiterals2 = _interopRequireDefault(_babelPluginTransformMemberExpressionLiterals);
37
38var _babelPluginTransformMergeSiblingVariables = require('babel-plugin-transform-merge-sibling-variables');
39
40var _babelPluginTransformMergeSiblingVariables2 = _interopRequireDefault(_babelPluginTransformMergeSiblingVariables);
41
42var _babelPluginTransformMinifyBooleans = require('babel-plugin-transform-minify-booleans');
43
44var _babelPluginTransformMinifyBooleans2 = _interopRequireDefault(_babelPluginTransformMinifyBooleans);
45
46var _babelPluginTransformPropertyLiterals = require('babel-plugin-transform-property-literals');
47
48var _babelPluginTransformPropertyLiterals2 = _interopRequireDefault(_babelPluginTransformPropertyLiterals);
49
50var _babelPluginTransformSimplifyComparisonOperators = require('babel-plugin-transform-simplify-comparison-operators');
51
52var _babelPluginTransformSimplifyComparisonOperators2 = _interopRequireDefault(_babelPluginTransformSimplifyComparisonOperators);
53
54var _babelPluginTransformUndefinedToVoid = require('babel-plugin-transform-undefined-to-void');
55
56var _babelPluginTransformUndefinedToVoid2 = _interopRequireDefault(_babelPluginTransformUndefinedToVoid);
57
58function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
59
60// plugins
61
62
63Error.stackTraceLimit = Infinity;
64/**
65 * The main function of the minifier
66 * @function
67 */
68function BabelMinify(inputCode) {
69 var _ref = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1];
70
71 var _ref$mangle = _ref.mangle;
72 let mangle = _ref$mangle === undefined ? true : _ref$mangle;
73 var _ref$mangle_globals = _ref.mangle_globals;
74 let mangle_globals = _ref$mangle_globals === undefined ? false : _ref$mangle_globals;
75 var _ref$dead_code = _ref.dead_code;
76 let dead_code = _ref$dead_code === undefined ? false : _ref$dead_code;
77 var _ref$conditionals = _ref.conditionals;
78 let conditionals = _ref$conditionals === undefined ? true : _ref$conditionals;
79 var _ref$evaluate = _ref.evaluate;
80 let evaluate = _ref$evaluate === undefined ? true : _ref$evaluate;
81 var _ref$drop_debugger = _ref.drop_debugger;
82 let // eval constant expressions
83 drop_debugger = _ref$drop_debugger === undefined ? false : _ref$drop_debugger;
84 var _ref$drop_console = _ref.drop_console;
85 let drop_console = _ref$drop_console === undefined ? false : _ref$drop_console;
86 var _ref$properties = _ref.properties;
87 let properties = _ref$properties === undefined ? true : _ref$properties;
88 var _ref$join_vars = _ref.join_vars;
89 let join_vars = _ref$join_vars === undefined ? true : _ref$join_vars;
90 var _ref$booleans = _ref.booleans;
91 let booleans = _ref$booleans === undefined ? true : _ref$booleans;
92 var _ref$unsafe = _ref.unsafe;
93 let unsafe = _ref$unsafe === undefined ? true : _ref$unsafe;
94 var _ref$keep_fnames = _ref.keep_fnames;
95 let keep_fnames = _ref$keep_fnames === undefined ? false : _ref$keep_fnames;
96 var _ref$npasses = _ref.npasses;
97 let
98
99 // number of passes
100 npasses = _ref$npasses === undefined ? 1 : _ref$npasses;
101 var _ref$babelrc = _ref.babelrc;
102 let
103
104 // passed on to babel transform to tell whether to use babelrc
105 babelrc = _ref$babelrc === undefined ? false : _ref$babelrc;
106 var _ref$plugins = _ref.plugins;
107 let
108
109 // should there be any other plugins added to this build process
110 plugins = _ref$plugins === undefined ? [] : _ref$plugins;
111 var _ref$presets = _ref.presets;
112 let
113
114 // should there be any other presets
115 presets = _ref$presets === undefined ? [] : _ref$presets;
116 var _ref$minify = _ref.minify;
117 let
118
119 // if false, babel-minify can give a list of plugins to use as a preset
120 minify = _ref$minify === undefined ? true : _ref$minify;
121
122
123 if (typeof inputCode !== 'string' && minify) throw new Error('Invalid Input');
124
125 /**
126 * The final list of plugins that are applied in babel transform
127 * This is the first list that's preffered in babel transform, the plugins
128 * that go into this take one pass, plugins that prefer separate passes go into
129 * the {finalPresets}
130 * @type {Array}
131 */
132 let minifyPlugins = [];
133
134 /**
135 * The final list of presets that are applied in SEPARATE passes
136 * @type {Array}
137 */
138 let passes = [];
139
140 evaluate && minifyPlugins.push(_babelPluginTransformEvaluate2.default);
141 drop_debugger && minifyPlugins.push(_babelPluginTransformRemoveDebugger2.default);
142 drop_console && minifyPlugins.push(_babelPluginTransformRemoveConsole2.default);
143 properties && minifyPlugins.push(_babelPluginTransformMemberExpressionLiterals2.default);
144 properties && minifyPlugins.push(_babelPluginTransformPropertyLiterals2.default);
145 join_vars && minifyPlugins.push(_babelPluginTransformMergeSiblingVariables2.default);
146 booleans && minifyPlugins.push(_babelPluginTransformMinifyBooleans2.default);
147 unsafe && minifyPlugins.push(_babelPluginTransformUndefinedToVoid2.default);
148 unsafe && minifyPlugins.push(_babelPluginTransformSimplifyComparisonOperators2.default);
149
150 /**
151 * Append all user passed plugins to minifyPlugins
152 */
153 minifyPlugins = minifyPlugins.concat(plugins);
154
155 /**
156 * Things that remove code or replace code in a major way,
157 * we just use then in separate presets to enable them to be
158 * under separate passes
159 */
160 if (dead_code) {
161 passes.push({ plugins: [_babelPluginTransformDeadCodeElimination2.default] });
162 }
163 if (conditionals) {
164 passes.push({ plugins: [_babelPluginTransformConditionals2.default] });
165 }
166
167 /**
168 * Append all user passed presets to passes
169 */
170 passes = passes.concat(presets);
171
172 /**
173 * Keep mangler to be in the last of the presets
174 * I don't know why clearly, but mangler seems to disrupt everything, so
175 * I just keep it as the last pass
176 */
177 if (mangle) {
178 passes.push({
179 plugins: [[_babelPluginTransformMangle2.default, {
180 keep_fnames: keep_fnames,
181 mangle_globals: mangle_globals
182 }]]
183 });
184 }
185
186 // if minify is false, return the plugins list to be used elsewhere
187 // maybe move this to a separate file later
188 if (!minify) return { plugins: minifyPlugins, presets: passes };
189
190 let result = { code: inputCode };
191
192 while (npasses-- > 0) {
193 result = (0, _babelCore.transform)(result.code, {
194 babelrc: babelrc,
195 comments: false,
196 compact: true,
197 minified: true,
198 passPerPreset: true,
199 presets: passes,
200 plugins: minifyPlugins
201 });
202 }
203
204 return result.code;
205}
206module.exports = exports['default'];
\No newline at end of file