Fixes issues with uglify.js usage

Summary: Adds flow type defs for uglify, and fixes the two issues found

Reviewed By: jeanlauliac

Differential Revision: D5029190

fbshipit-source-id: eb5947b051844938da241e002b727edc1384e3a6
This commit is contained in:
David Aurelio 2017-05-10 05:15:18 -07:00 committed by Facebook Github Bot
parent f088bca580
commit f1a220b3cf
5 changed files with 87 additions and 9 deletions

71
flow/uglify.js Normal file
View File

@ -0,0 +1,71 @@
/**
* Copyright (c) 2013-present, Facebook, Inc.
* All rights reserved.
*
* This source code is licensed under the BSD-style license found in the
* LICENSE file in the root directory of this source tree. An additional grant
* of patent rights can be found in the PATENTS file in the same directory.
*/
'use strict';
type _SourceMap = {
file?: string,
mappings: string,
names: Array<string>,
sourceRoot?: string,
sources: Array<string>,
sourcesContent?: Array<?string>,
version: number,
};
type _Result<MapT> = {
code: string,
map: MapT,
};
type _Options = {
compress?: false | {||},
fromString?: boolean,
inSourceMap?: string | ?_SourceMap,
mangle?: boolean | {|
except?: Array<string>,
toplevel?: boolean,
eval?: boolean,
keep_fnames?: boolean,
|},
mangleProperties?: boolean | {|
regex?: RegExp,
ignore_quoted?: boolean,
debug?: false | string,
|},
outFileName?: string,
output?: {|
ascii_only?: boolean,
screw_ie8?: boolean,
|},
parse?: {|
strict?: boolean,
bare_returns?: boolean,
filename?: string,
|},
sourceMapUrl?: string,
sourceRoot?: string,
warnings?: boolean,
};
type _Input =
| string // code or file name
| Array<string> // array of file names
| {[filename: string]: string}; // file names and corresponding code
declare module 'uglify-js' {
declare function minify(
fileOrFilesOrCode: _Input,
options?: _Options & {outSourceMap?: ?false | ''},
): _Result<void>;
declare function minify(
fileOrFilesOrCode: _Input,
options?: _Options & {outSourceMap: true | string},
): _Result<string>;
}

View File

@ -15,17 +15,19 @@ const uglify = require('uglify-js');
const {UGLIFY_JS_OUTPUT_OPTIONS} = require('./JsMinification'); const {UGLIFY_JS_OUTPUT_OPTIONS} = require('./JsMinification');
function minify(filename: string, code: string, sourceMap: ?string) { import type {MappingsMap} from '../../lib/SourceMap';
const minifyResult = uglify.minify(code, {
function minify(filename: string, inputCode: string, sourceMap: ?MappingsMap) {
let {code, map} = uglify.minify(inputCode, {
fromString: true, fromString: true,
inSourceMap: sourceMap, inSourceMap: sourceMap,
outSourceMap: true, outSourceMap: true,
output: UGLIFY_JS_OUTPUT_OPTIONS, output: UGLIFY_JS_OUTPUT_OPTIONS,
}); });
minifyResult.map = JSON.parse(minifyResult.map); map = JSON.parse(map);
minifyResult.map.sources = [filename]; map.sources = [filename];
return minifyResult; return {code, map};
} }
module.exports = minify; module.exports = minify;

View File

@ -166,7 +166,7 @@ exports.transformAndExtractDependencies = (
exports.minify = ( exports.minify = (
filename: string, filename: string,
code: string, code: string,
sourceMap: string, sourceMap: MappingsMap,
callback: (error: ?Error, result: mixed) => mixed, callback: (error: ?Error, result: mixed) => mixed,
) => { ) => {
var result; var result;

View File

@ -110,7 +110,7 @@ export type TransformResult = {|
code: string, code: string,
dependencies: Array<string>, dependencies: Array<string>,
dependencyMapName?: string, dependencyMapName?: string,
map: ?Object, map: ?MappingsMap,
|}; |};
export type TransformResults = {[string]: TransformResult}; export type TransformResults = {[string]: TransformResult};

View File

@ -19,6 +19,7 @@ const minify = require('../../JSTransformer/worker/minify');
const sourceMap = require('source-map'); const sourceMap = require('source-map');
import type {TransformedSourceFile, TransformResult} from '../types.flow'; import type {TransformedSourceFile, TransformResult} from '../types.flow';
import type {MappingsMap, SourceMap} from '../../lib/SourceMap';
export type OptimizationOptions = {| export type OptimizationOptions = {|
dev: boolean, dev: boolean,
@ -71,7 +72,7 @@ function optimize(transformed, file, originalCode, options): TransformResult {
gen.code, gen.code,
inputMap && mergeSourceMaps(file, inputMap, gen.map), inputMap && mergeSourceMaps(file, inputMap, gen.map),
); );
return {code: min.code, map: inputMap && min.map, dependencies}; return {code: min.code, map: min.map, dependencies};
} }
function optimizeCode(code, map, filename, inliningOptions) { function optimizeCode(code, map, filename, inliningOptions) {
@ -86,7 +87,11 @@ function optimizeCode(code, map, filename, inliningOptions) {
}); });
} }
function mergeSourceMaps(file, originalMap, secondMap) { function mergeSourceMaps(
file: string,
originalMap: SourceMap,
secondMap: SourceMap,
): MappingsMap {
const merged = new sourceMap.SourceMapGenerator(); const merged = new sourceMap.SourceMapGenerator();
const inputMap = new sourceMap.SourceMapConsumer(originalMap); const inputMap = new sourceMap.SourceMapConsumer(originalMap);
new sourceMap.SourceMapConsumer(secondMap) new sourceMap.SourceMapConsumer(secondMap)