packager worker: more @flow

Reviewed By: matryoshcow

Differential Revision: D4160528

fbshipit-source-id: 5f43cb47717288c5344c1204cf435ec727ca752e
This commit is contained in:
Jean Lauliac 2016-11-16 10:42:13 -08:00 committed by Facebook Github Bot
parent 855a74d2b1
commit dfd9713fce
6 changed files with 68 additions and 29 deletions

View File

@ -5,10 +5,15 @@
* This source code is licensed under the BSD-style license found in the * 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 * 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. * of patent rights can be found in the PATENTS file in the same directory.
*
* @flow
*/ */
'use strict'; 'use strict';
const babel = require('babel-core'); const babel = require('babel-core');
import type {Ast, SourceMap} from 'babel-core';
const t = babel.types; const t = babel.types;
const Conditional = { const Conditional = {
@ -65,7 +70,11 @@ const plugin = {
}, },
}; };
function constantFolding(filename, transformResult) { function constantFolding(filename: string, transformResult: {
ast: Ast,
code?: ?string,
map: ?SourceMap,
}) {
return babel.transformFromAst(transformResult.ast, transformResult.code, { return babel.transformFromAst(transformResult.ast, transformResult.code, {
filename, filename,
plugins: [plugin], plugins: [plugin],

View File

@ -5,7 +5,10 @@
* This source code is licensed under the BSD-style license found in the * 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 * 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. * of patent rights can be found in the PATENTS file in the same directory.
*
* @flow
*/ */
'use strict'; 'use strict';
const babel = require('babel-core'); const babel = require('babel-core');
@ -20,7 +23,7 @@ const babylon = require('babylon');
* dependencies, and an array of offsets to the string literals with module IDs. * dependencies, and an array of offsets to the string literals with module IDs.
* The index points to the opening quote. * The index points to the opening quote.
*/ */
function extractDependencies(code) { function extractDependencies(code: string) {
const ast = babylon.parse(code); const ast = babylon.parse(code);
const dependencies = new Set(); const dependencies = new Set();
const dependencyOffsets = []; const dependencyOffsets = [];

View File

@ -5,10 +5,16 @@
* This source code is licensed under the BSD-style license found in the * 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 * 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. * of patent rights can be found in the PATENTS file in the same directory.
*
* @flow
*/ */
'use strict'; 'use strict';
const babel = require('babel-core'); const babel = require('babel-core');
const invariant = require('invariant');
import type {Ast, SourceMap} from 'babel-core';
const t = babel.types; const t = babel.types;
const React = {name: 'React'}; const React = {name: 'React'};
@ -145,7 +151,17 @@ function checkRequireArgs(args, dependencyId) {
t.isNumericLiteral(args[0]) && t.isStringLiteral(args[1], pattern); t.isNumericLiteral(args[0]) && t.isStringLiteral(args[1], pattern);
} }
function inline(filename, transformResult, options) { type AstResult = {
ast: Ast,
code: ?string,
map: ?SourceMap,
};
function inline(
filename: string,
transformResult: {ast?: ?Ast, code: string, map: ?SourceMap},
options: {},
): AstResult {
const code = transformResult.code; const code = transformResult.code;
const babelOptions = { const babelOptions = {
filename, filename,
@ -158,9 +174,12 @@ function inline(filename, transformResult, options) {
compact: true, compact: true,
}; };
return transformResult.ast const result = transformResult.ast
? babel.transformFromAst(transformResult.ast, code, babelOptions) ? babel.transformFromAst(transformResult.ast, code, babelOptions)
: babel.transform(code, babelOptions); : babel.transform(code, babelOptions);
const {ast} = result;
invariant(ast != null, 'Missing AST in babel transform results.');
return {ast, code: result.code, map: result.map};
} }
inline.plugin = inlinePlugin; inline.plugin = inlinePlugin;

View File

@ -5,12 +5,15 @@
* This source code is licensed under the BSD-style license found in the * 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 * 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. * of patent rights can be found in the PATENTS file in the same directory.
*
* @flow
*/ */
'use strict'; 'use strict';
const uglify = require('uglify-js'); const uglify = require('uglify-js');
function minify(filename, code, sourceMap) { function minify(filename: string, code: string, sourceMap: ?string) {
const minifyResult = uglify.minify(code, { const minifyResult = uglify.minify(code, {
fromString: true, fromString: true,
inSourceMap: sourceMap, inSourceMap: sourceMap,

View File

@ -14,9 +14,11 @@
const constantFolding = require('./constant-folding'); const constantFolding = require('./constant-folding');
const extractDependencies = require('./extract-dependencies'); const extractDependencies = require('./extract-dependencies');
const inline = require('./inline'); const inline = require('./inline');
const invariant = require('invariant');
const minify = require('./minify'); const minify = require('./minify');
import type {LogEntry} from '../../Logger/Types'; import type {LogEntry} from '../../Logger/Types';
import type {Ast, SourceMap} from 'babel-core';
function makeTransformParams(filename, sourceCode, options) { function makeTransformParams(filename, sourceCode, options) {
if (filename.endsWith('.json')) { if (filename.endsWith('.json')) {
@ -32,11 +34,17 @@ export type TransformedCode = {
map?: ?{}, map?: ?{},
}; };
type Transform = (params: { type Transform = (
params: {
filename: string, filename: string,
sourceCode: string, sourceCode: string,
options: ?{}, options: ?{},
}) => mixed; },
callback: (
error?: Error,
tranformed?: {ast: ?Ast, code: string, map: ?SourceMap},
) => mixed,
) => void;
export type Options = {transform?: {}}; export type Options = {transform?: {}};
@ -75,15 +83,18 @@ function transformCode(
return; return;
} }
invariant(
transformed != null,
'Missing transform results despite having no error.',
);
var code, map; var code, map;
if (options.minify) { if (options.minify) {
const optimized = ({code, map} =
constantFolding(filename, inline(filename, transformed, options)); constantFolding(filename, inline(filename, transformed, options)));
code = optimized.code; invariant(code != null, 'Missing code from constant-folding transform.');
map = optimized.map;
} else { } else {
code = transformed.code; ({code, map} = transformed);
map = transformed.map;
} }
if (isJson) { if (isJson) {

View File

@ -11,19 +11,13 @@
'use strict'; 'use strict';
type SourceMapBase = { import type {SourceMap as BabelSourceMap} from 'babel-core';
export type SourceMap = BabelSourceMap;
export type CombinedSourceMap = {
version: number, version: number,
file: string, file: string,
};
export type SourceMap = SourceMapBase & {
sources: Array<string>,
names: Array<string>,
mappings: string,
sourcesContent: Array<string>,
};
export type CombinedSourceMap = SourceMapBase & {
sections: Array<{ sections: Array<{
offset: {line: number, column: number}, offset: {line: number, column: number},
map: SourceMap, map: SourceMap,