Fix minification of JSON files

Summary:
When moving the minification to the worker, I forgot to also minify JSON files (they have an early return).

This diff fixes this :)

Reviewed By: davidaurelio

Differential Revision: D7707317

fbshipit-source-id: 1114017b811861a6f2caebe79e1d79e6ad9a7b1e
This commit is contained in:
Rafael Oleza 2018-04-20 09:17:37 -07:00 committed by Facebook Github Bot
parent df53fb3de5
commit a8ce776044
2 changed files with 66 additions and 18 deletions

View File

@ -33,10 +33,8 @@ const {
import type {DynamicRequiresBehavior} from '../ModuleGraph/worker/collectDependencies'; import type {DynamicRequiresBehavior} from '../ModuleGraph/worker/collectDependencies';
import type {LocalPath} from '../node-haste/lib/toLocalPath'; import type {LocalPath} from '../node-haste/lib/toLocalPath';
import type {Ast} from '@babel/core'; import type {Ast} from '@babel/core';
import type {BabelSourceMap} from '@babel/core';
import type {Plugins as BabelPlugins} from 'babel-core'; import type {Plugins as BabelPlugins} from 'babel-core';
import type {LogEntry} from 'metro-core/src/Logger'; import type {LogEntry} from 'metro-core/src/Logger';
import type {ResultWithMap} from 'metro-minify-uglify';
import type {MetroSourceMapSegmentTuple} from 'metro-source-map'; import type {MetroSourceMapSegmentTuple} from 'metro-source-map';
export type TransformedCode = { export type TransformedCode = {
@ -153,15 +151,26 @@ async function transformCode(
.digest('hex'); .digest('hex');
if (filename.endsWith('.json')) { if (filename.endsWith('.json')) {
const code = JsFileWrapping.wrapJson(sourceCode); let code = JsFileWrapping.wrapJson(sourceCode);
let map = [];
const transformFileEndLogEntry = getEndLogEntry( const transformFileEndLogEntry = getEndLogEntry(
transformFileStartLogEntry, transformFileStartLogEntry,
filename, filename,
); );
if (options.minify) {
({map, code} = await minifyCode(
filename,
code,
sourceCode,
map,
minifierPath,
));
}
return { return {
result: {dependencies: [], code, map: []}, result: {dependencies: [], code, map},
sha1, sha1,
transformFileStartLogEntry, transformFileStartLogEntry,
transformFileEndLogEntry, transformFileEndLogEntry,
@ -262,19 +271,13 @@ async function transformCode(
let code = result.code; let code = result.code;
if (options.minify) { if (options.minify) {
const sourceMap = fromRawMappings([ ({map, code} = await minifyCode(
{code, source: sourceCode, map, path: filename},
]).toMap(undefined, {});
const minified = await minifyCode(
filename, filename,
result.code, result.code,
sourceMap, sourceCode,
map,
minifierPath, minifierPath,
); ));
code = minified.code;
map = minified.map ? toBabelSegments(minified.map).map(toSegmentTuple) : [];
} }
return { return {
@ -285,15 +288,31 @@ async function transformCode(
}; };
} }
function minifyCode( async function minifyCode(
filename: string, filename: string,
code: string, code: string,
sourceMap: BabelSourceMap, source: string,
map: Array<MetroSourceMapSegmentTuple>,
minifierPath: string, minifierPath: string,
): ResultWithMap | Promise<ResultWithMap> { ): Promise<{
code: string,
map: Array<MetroSourceMapSegmentTuple>,
}> {
const sourceMap = fromRawMappings([
{code, source, map, path: filename},
]).toMap(undefined, {});
const minify = getMinifier(minifierPath); const minify = getMinifier(minifierPath);
try { try {
return minify.withSourceMap(code, sourceMap, filename); const minified = minify.withSourceMap(code, sourceMap, filename);
return {
code: minified.code,
map: minified.map
? toBabelSegments(minified.map).map(toSegmentTuple)
: [],
};
} catch (error) { } catch (error) {
if (error.constructor.name === 'JS_Parse_Error') { if (error.constructor.name === 'JS_Parse_Error') {
throw new Error( throw new Error(

View File

@ -252,4 +252,33 @@ describe('code transformation worker:', () => {
].join('\n'), ].join('\n'),
); );
}); });
it('minifies a JSON file', async () => {
expect(
(await transformCode(
'/root/node_modules/bar/file.json',
`node_modules/bar/file.js`,
'arbitrary(code);',
path.join(__dirname, '../../../transformer.js'),
false,
{
dev: true,
minify: true,
transform: {},
enableBabelRCLookup: false,
},
[],
'',
'minifyModulePath',
'asyncRequire',
'throwAtRuntime',
)).result.code,
).toBe(
[
'__d(function(global, require, module, exports) {',
' module.exports = minified(code);;',
'});',
].join('\n'),
);
});
}); });