diff --git a/static/transforms/__tests__/electron-stubs.node.js b/static/transforms/__tests__/electron-stubs.node.js new file mode 100644 index 000000000..a1f7757e1 --- /dev/null +++ b/static/transforms/__tests__/electron-stubs.node.js @@ -0,0 +1,36 @@ +/** + * Copyright 2018-present Facebook. + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + * @format + */ + +import {transform} from '@babel/core'; +import generate from '@babel/generator'; + +import electronStubs from '../electron-stubs'; + +const babelOptions = { + ast: true, + plugins: [electronStubs], + filename: 'index.js', +}; + +test('transform electron requires to inlined stubs', () => { + const src = 'require("electron")'; + const transformed = transform(src, babelOptions).ast; + const body = transformed.program.body[0]; + expect(body.type).toBe('ExpressionStatement'); + expect(body.expression.properties.map(p => p.key.name)).toContain('remote'); +}); + +test('transform performance calls to requires', () => { + for (const method of ['mark', 'measure']) { + const src = `performance.${method}('something')`; + const transformed = transform(src, babelOptions).ast; + const {code} = generate(transformed); + expect(code).toBe( + `require('perf_hooks').performance.${method}('something');`, + ); + } +}); diff --git a/static/transforms/electron-stubs.js b/static/transforms/electron-stubs.js index d7d3c5bbf..9c2019766 100644 --- a/static/transforms/electron-stubs.js +++ b/static/transforms/electron-stubs.js @@ -11,6 +11,7 @@ var fs = require('fs'); var electronStubs = babylon.parseExpression( fs.readFileSync('static/electron-stubs.notjs').toString(), ); +var perfHooks = babylon.parseExpression("require('perf_hooks').performance"); module.exports = function(babel) { return { @@ -27,6 +28,17 @@ module.exports = function(babel) { path.replaceWith(electronStubs); } } + if ( + path.node.type === 'CallExpression' && + path.node.callee.type === 'MemberExpression' && + path.node.callee.object.name === 'performance' + ) { + // 'perf_hooks' was added in Node 8.5.0 but doesn't appear to be + // present in electron. We can remove this and switch to using + // interval when it is. Until then, continue using browser.performance + // for real and swap in node's perf_hooks when we dont have electron. + path.node.callee.object = perfHooks; + } }, }, };