diff --git a/packages/warning/src/babel-plugin.js b/packages/warning/src/babel-plugin.js index 12eb65f699585a..85577f32f9001a 100644 --- a/packages/warning/src/babel-plugin.js +++ b/packages/warning/src/babel-plugin.js @@ -3,16 +3,30 @@ const pkg = require( '../package.json' ); function babelPlugin( { types: t } ) { const seen = Symbol(); - const binaryExpression = t.binaryExpression( + const typeofProcessExpression = t.binaryExpression( '!==', - t.memberExpression( - t.memberExpression( t.identifier( 'process' ), t.identifier( 'env' ), false ), - t.identifier( 'NODE_ENV' ), - false - ), + t.unaryExpression( 'typeof', t.identifier( 'process' ), false ), + t.stringLiteral( 'undefined' ) + ); + + const processEnvExpression = t.memberExpression( + t.identifier( 'process' ), + t.identifier( 'env' ), + false + ); + + const nodeEnvCheckExpression = t.binaryExpression( + '!==', + t.memberExpression( processEnvExpression, t.identifier( 'NODE_ENV' ), false ), t.stringLiteral( 'production' ) ); + const logicalExpression = t.logicalExpression( + '&&', + t.logicalExpression( '&&', typeofProcessExpression, processEnvExpression ), + nodeEnvCheckExpression + ); + return { visitor: { ImportDeclaration( path, state ) { @@ -45,11 +59,11 @@ function babelPlugin( { types: t } ) { // Turns this code: // warning(condition, argument, argument); // into this: - // process.env.NODE_ENV !== "production" ? warning(condition, argument, argument) : void 0; + // typeof process !== "undefined" && process.env && process.env.NODE_ENV !== "production" ? warning(condition, argument, argument) : void 0; node[ seen ] = true; path.replaceWith( t.ifStatement( - binaryExpression, + logicalExpression, t.blockStatement( [ t.expressionStatement( node ) ] ) ) ); diff --git a/packages/warning/src/test/babel-plugin.js b/packages/warning/src/test/babel-plugin.js index 1ed9b2f556aa51..7758af5a96b9c4 100644 --- a/packages/warning/src/test/babel-plugin.js +++ b/packages/warning/src/test/babel-plugin.js @@ -29,7 +29,7 @@ describe( 'babel-plugin', function() { ), join( 'import warning from "@wordpress/warning";', - 'process.env.NODE_ENV !== "production" ? warning(true, "a", "b") : void 0;' + 'typeof process !== "undefined" && process.env && process.env.NODE_ENV !== "production" ? warning(true, "a", "b") : void 0;' ) ); } ); @@ -44,7 +44,7 @@ describe( 'babel-plugin', function() { it( 'should replace warning calls without import declaration with plugin options', () => { compare( 'warning(true, "a", "b");', - 'process.env.NODE_ENV !== "production" ? warning(true, "a", "b") : void 0;', + 'typeof process !== "undefined" && process.env && process.env.NODE_ENV !== "production" ? warning(true, "a", "b") : void 0;', { callee: 'warning' } ); } ); @@ -59,9 +59,9 @@ describe( 'babel-plugin', function() { ), join( 'import warning from "@wordpress/warning";', - 'process.env.NODE_ENV !== "production" ? warning(true, "a", "b") : void 0;', - 'process.env.NODE_ENV !== "production" ? warning(false, "b", "a") : void 0;', - 'process.env.NODE_ENV !== "production" ? warning(cond, "c") : void 0;' + 'typeof process !== "undefined" && process.env && process.env.NODE_ENV !== "production" ? warning(true, "a", "b") : void 0;', + 'typeof process !== "undefined" && process.env && process.env.NODE_ENV !== "production" ? warning(false, "b", "a") : void 0;', + 'typeof process !== "undefined" && process.env && process.env.NODE_ENV !== "production" ? warning(cond, "c") : void 0;' ) ); } ); @@ -76,9 +76,9 @@ describe( 'babel-plugin', function() { ), join( 'import warn from "@wordpress/warning";', - 'process.env.NODE_ENV !== "production" ? warn(true, "a", "b") : void 0;', - 'process.env.NODE_ENV !== "production" ? warn(false, "b", "a") : void 0;', - 'process.env.NODE_ENV !== "production" ? warn(cond, "c") : void 0;' + 'typeof process !== "undefined" && process.env && process.env.NODE_ENV !== "production" ? warn(true, "a", "b") : void 0;', + 'typeof process !== "undefined" && process.env && process.env.NODE_ENV !== "production" ? warn(false, "b", "a") : void 0;', + 'typeof process !== "undefined" && process.env && process.env.NODE_ENV !== "production" ? warn(cond, "c") : void 0;' ) ); } ); @@ -93,9 +93,9 @@ describe( 'babel-plugin', function() { ), join( 'import warn from "@wordpress/warning";', - 'process.env.NODE_ENV !== "production" ? warn(true, "a", "b") : void 0;', - 'process.env.NODE_ENV !== "production" ? warn(false, "b", "a") : void 0;', - 'process.env.NODE_ENV !== "production" ? warn(cond, "c") : void 0;' + 'typeof process !== "undefined" && process.env && process.env.NODE_ENV !== "production" ? warn(true, "a", "b") : void 0;', + 'typeof process !== "undefined" && process.env && process.env.NODE_ENV !== "production" ? warn(false, "b", "a") : void 0;', + 'typeof process !== "undefined" && process.env && process.env.NODE_ENV !== "production" ? warn(cond, "c") : void 0;' ) ); } );