mirror of https://github.com/status-im/metro.git
Make constant folding plugin use context for babel types
Summary: This makes the plugin use the passed on babel api rather than hardcoded pulling in babel 6 or 7. This is important since they are different packages now and we need to work with them side-by-side. Reviewed By: mjesun Differential Revision: D7083873 fbshipit-source-id: 2ce89e0627005bb29ff8d3e0e1ac51fe8ee4eabd
This commit is contained in:
parent
f179352292
commit
2303f3b18d
|
@ -10,12 +10,29 @@
|
||||||
*/
|
*/
|
||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
const constantFolding = require('../constant-folding');
|
const constantFoldingPlugin = require('../constant-folding-plugin');
|
||||||
|
|
||||||
const {transformSync} = require('../../../babel-bridge');
|
const {transformSync} = require('../../../babel-bridge');
|
||||||
|
const {transformFromAstSync} = require('../../../babel-bridge');
|
||||||
|
|
||||||
import type {TransformResult} from '@babel/core';
|
import type {TransformResult} from '@babel/core';
|
||||||
|
|
||||||
|
function constantFolding(
|
||||||
|
filename: string,
|
||||||
|
transformResult: TransformResult,
|
||||||
|
): TransformResult {
|
||||||
|
return transformFromAstSync(transformResult.ast, transformResult.code, {
|
||||||
|
filename,
|
||||||
|
plugins: [constantFoldingPlugin],
|
||||||
|
inputSourceMap: transformResult.map || undefined, // may not be null
|
||||||
|
sourceMaps: true,
|
||||||
|
sourceFileName: filename,
|
||||||
|
babelrc: false,
|
||||||
|
compact: true,
|
||||||
|
retainLines: true,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
function parse(code: string): TransformResult {
|
function parse(code: string): TransformResult {
|
||||||
return transformSync(code, {
|
return transformSync(code, {
|
||||||
code: false,
|
code: false,
|
|
@ -10,7 +10,7 @@
|
||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
jest
|
jest
|
||||||
.mock('../constant-folding')
|
.mock('../constant-folding-plugin')
|
||||||
.mock('../inline-plugin')
|
.mock('../inline-plugin')
|
||||||
.mock('metro-minify-uglify');
|
.mock('metro-minify-uglify');
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,73 @@
|
||||||
|
/**
|
||||||
|
* Copyright (c) 2016-present, Facebook, Inc.
|
||||||
|
*
|
||||||
|
* This source code is licensed under the MIT license found in the
|
||||||
|
* LICENSE file in the root directory of this source tree.
|
||||||
|
*
|
||||||
|
* @flow
|
||||||
|
* @format
|
||||||
|
*/
|
||||||
|
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
import typeof {types as BabelTypes} from 'babel-core';
|
||||||
|
|
||||||
|
function constantFoldingPlugin(context: {types: BabelTypes}) {
|
||||||
|
const t = context.types;
|
||||||
|
|
||||||
|
const Conditional = {
|
||||||
|
exit(path: Object) {
|
||||||
|
const node = path.node;
|
||||||
|
const test = node.test;
|
||||||
|
if (t.isLiteral(test)) {
|
||||||
|
if (test.value || node.alternate) {
|
||||||
|
path.replaceWith(test.value ? node.consequent : node.alternate);
|
||||||
|
} else if (!test.value) {
|
||||||
|
path.remove();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
return {
|
||||||
|
visitor: {
|
||||||
|
BinaryExpression: {
|
||||||
|
exit(path: Object) {
|
||||||
|
const node = path.node;
|
||||||
|
if (t.isLiteral(node.left) && t.isLiteral(node.right)) {
|
||||||
|
const result = path.evaluate();
|
||||||
|
if (result.confident) {
|
||||||
|
path.replaceWith(t.valueToNode(result.value));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
},
|
||||||
|
ConditionalExpression: Conditional,
|
||||||
|
IfStatement: Conditional,
|
||||||
|
LogicalExpression: {
|
||||||
|
exit(path: Object) {
|
||||||
|
const node = path.node;
|
||||||
|
const left = node.left;
|
||||||
|
if (t.isLiteral(left)) {
|
||||||
|
const value = t.isNullLiteral(left) ? null : left.value;
|
||||||
|
if (node.operator === '||') {
|
||||||
|
path.replaceWith(value ? left : node.right);
|
||||||
|
} else {
|
||||||
|
path.replaceWith(value ? node.right : left);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
},
|
||||||
|
UnaryExpression: {
|
||||||
|
exit(path: Object) {
|
||||||
|
const node = path.node;
|
||||||
|
if (node.operator === '!' && t.isLiteral(node.argument)) {
|
||||||
|
path.replaceWith(t.valueToNode(!node.argument.value));
|
||||||
|
}
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = constantFoldingPlugin;
|
|
@ -1,86 +0,0 @@
|
||||||
/**
|
|
||||||
* Copyright (c) 2016-present, Facebook, Inc.
|
|
||||||
*
|
|
||||||
* This source code is licensed under the MIT license found in the
|
|
||||||
* LICENSE file in the root directory of this source tree.
|
|
||||||
*
|
|
||||||
* @flow
|
|
||||||
* @format
|
|
||||||
*/
|
|
||||||
|
|
||||||
'use strict';
|
|
||||||
|
|
||||||
const {babelTypes: t} = require('../../babel-bridge');
|
|
||||||
const {transformFromAstSync} = require('../../babel-bridge');
|
|
||||||
|
|
||||||
import type {TransformResult} from '@babel/core';
|
|
||||||
|
|
||||||
const Conditional = {
|
|
||||||
exit(path) {
|
|
||||||
const node = path.node;
|
|
||||||
const test = node.test;
|
|
||||||
if (t.isLiteral(test)) {
|
|
||||||
if (test.value || node.alternate) {
|
|
||||||
path.replaceWith(test.value ? node.consequent : node.alternate);
|
|
||||||
} else if (!test.value) {
|
|
||||||
path.remove();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
};
|
|
||||||
|
|
||||||
const plugin = {
|
|
||||||
visitor: {
|
|
||||||
BinaryExpression: {
|
|
||||||
exit(path) {
|
|
||||||
const node = path.node;
|
|
||||||
if (t.isLiteral(node.left) && t.isLiteral(node.right)) {
|
|
||||||
const result = path.evaluate();
|
|
||||||
if (result.confident) {
|
|
||||||
path.replaceWith(t.valueToNode(result.value));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
},
|
|
||||||
ConditionalExpression: Conditional,
|
|
||||||
IfStatement: Conditional,
|
|
||||||
LogicalExpression: {
|
|
||||||
exit(path) {
|
|
||||||
const node = path.node;
|
|
||||||
const left = node.left;
|
|
||||||
if (t.isLiteral(left)) {
|
|
||||||
const value = t.isNullLiteral(left) ? null : left.value;
|
|
||||||
if (node.operator === '||') {
|
|
||||||
path.replaceWith(value ? left : node.right);
|
|
||||||
} else {
|
|
||||||
path.replaceWith(value ? node.right : left);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
},
|
|
||||||
UnaryExpression: {
|
|
||||||
exit(path) {
|
|
||||||
const node = path.node;
|
|
||||||
if (node.operator === '!' && t.isLiteral(node.argument)) {
|
|
||||||
path.replaceWith(t.valueToNode(!node.argument.value));
|
|
||||||
}
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
};
|
|
||||||
|
|
||||||
function constantFolding(filename: string, transformResult: TransformResult) {
|
|
||||||
return transformFromAstSync(transformResult.ast, transformResult.code, {
|
|
||||||
filename,
|
|
||||||
plugins: [plugin],
|
|
||||||
inputSourceMap: transformResult.map || undefined, // may not be null
|
|
||||||
sourceMaps: true,
|
|
||||||
sourceFileName: filename,
|
|
||||||
babelrc: false,
|
|
||||||
compact: true,
|
|
||||||
retainLines: true,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
constantFolding.plugin = plugin;
|
|
||||||
module.exports = constantFolding;
|
|
|
@ -14,7 +14,7 @@ const JsFileWrapping = require('../../ModuleGraph/worker/JsFileWrapping');
|
||||||
|
|
||||||
const assetTransformer = require('../../assetTransformer');
|
const assetTransformer = require('../../assetTransformer');
|
||||||
const collectDependencies = require('../../ModuleGraph/worker/collectDependencies');
|
const collectDependencies = require('../../ModuleGraph/worker/collectDependencies');
|
||||||
const constantFolding = require('./constant-folding');
|
const constantFoldingPlugin = require('./constant-folding-plugin');
|
||||||
const getMinifier = require('../../lib/getMinifier');
|
const getMinifier = require('../../lib/getMinifier');
|
||||||
const inlinePlugin = require('./inline-plugin');
|
const inlinePlugin = require('./inline-plugin');
|
||||||
const optimizeDependencies = require('../../ModuleGraph/worker/optimizeDependencies');
|
const optimizeDependencies = require('../../ModuleGraph/worker/optimizeDependencies');
|
||||||
|
@ -231,7 +231,7 @@ function transformCode(
|
||||||
|
|
||||||
const plugins = options.dev
|
const plugins = options.dev
|
||||||
? []
|
? []
|
||||||
: [[inlinePlugin, options], [constantFolding.plugin, options]];
|
: [[inlinePlugin, options], [constantFoldingPlugin, options]];
|
||||||
|
|
||||||
// $FlowFixMe TODO t26372934 Plugin system
|
// $FlowFixMe TODO t26372934 Plugin system
|
||||||
const transformer: Transformer<*> = require(transformerPath);
|
const transformer: Transformer<*> = require(transformerPath);
|
||||||
|
|
|
@ -10,8 +10,7 @@
|
||||||
|
|
||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
const constantFolding = require('../../JSTransformer/worker/constant-folding')
|
const constantFoldingPlugin = require('../../JSTransformer/worker/constant-folding-plugin');
|
||||||
.plugin;
|
|
||||||
const generate = require('./generate');
|
const generate = require('./generate');
|
||||||
const getMinifier = require('../../lib/getMinifier');
|
const getMinifier = require('../../lib/getMinifier');
|
||||||
const inlinePlugin = require('../../JSTransformer/worker/inline-plugin');
|
const inlinePlugin = require('../../JSTransformer/worker/inline-plugin');
|
||||||
|
@ -117,7 +116,7 @@ function optimizeCode(
|
||||||
): BabelTransformResult {
|
): BabelTransformResult {
|
||||||
return transformSync(code, {
|
return transformSync(code, {
|
||||||
plugins: [
|
plugins: [
|
||||||
[constantFolding],
|
[constantFoldingPlugin],
|
||||||
[inlinePlugin, {...inliningOptions, isWrapped: true}],
|
[inlinePlugin, {...inliningOptions, isWrapped: true}],
|
||||||
],
|
],
|
||||||
babelrc: false,
|
babelrc: false,
|
||||||
|
|
Loading…
Reference in New Issue