mirror of
https://github.com/facebook/react-native.git
synced 2025-11-01 09:14:26 +00:00
5403946f09
Reviewed By: davidaurelio Differential Revision: D4627645 fbshipit-source-id: 3cf368c6a24a555b7d0a39045f6ba6fd92ae34e1
98 lines
3.0 KiB
JavaScript
98 lines
3.0 KiB
JavaScript
/**
|
|
* Copyright (c) 2016-present, Facebook, Inc.
|
|
* All rights reserved.
|
|
*
|
|
* 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
|
|
* of patent rights can be found in the PATENTS file in the same directory.
|
|
*/
|
|
'use strict';
|
|
|
|
jest.disableAutomock();
|
|
|
|
const optimizeModule = require('../optimize-module');
|
|
const transformModule = require('../transform-module');
|
|
const transformer = require('../../../../transformer.js');
|
|
const {SourceMapConsumer} = require('source-map');
|
|
|
|
const {objectContaining} = jasmine;
|
|
|
|
describe('optimizing JS modules', () => {
|
|
const filename = 'arbitrary/file.js';
|
|
const optimizationOptions = {
|
|
dev: false,
|
|
platform: 'android',
|
|
};
|
|
const originalCode =
|
|
`if (Platform.OS !== 'android') {
|
|
require('arbitrary-dev');
|
|
} else {
|
|
__DEV__ ? require('arbitrary-android-dev') : require('arbitrary-android-prod');
|
|
}`;
|
|
|
|
let transformResult;
|
|
beforeAll(done => {
|
|
transformModule(originalCode, {filename, transformer}, (error, result) => {
|
|
if (error) {
|
|
throw error;
|
|
}
|
|
transformResult = JSON.stringify(result);
|
|
done();
|
|
});
|
|
});
|
|
|
|
it('copies everything from the transformed file, except for transform results', () => {
|
|
const result = optimizeModule(transformResult, optimizationOptions);
|
|
const expected = JSON.parse(transformResult);
|
|
delete expected.transformed;
|
|
expect(result).toEqual(objectContaining(expected));
|
|
});
|
|
|
|
describe('code optimization', () => {
|
|
let dependencyMapName, injectedVars, optimized, requireName;
|
|
beforeAll(() => {
|
|
const result = optimizeModule(transformResult, optimizationOptions);
|
|
optimized = result.transformed.default;
|
|
injectedVars = optimized.code.match(/function\(([^)]*)/)[1].split(',');
|
|
[, requireName,,, dependencyMapName] = injectedVars;
|
|
});
|
|
|
|
it('optimizes code', () => {
|
|
expect(optimized.code)
|
|
.toEqual(`__d(function(${injectedVars}){${requireName}(${dependencyMapName}[0])});`);
|
|
});
|
|
|
|
it('extracts dependencies', () => {
|
|
expect(optimized.dependencies).toEqual(['arbitrary-android-prod']);
|
|
});
|
|
|
|
it('creates source maps', () => {
|
|
const consumer = new SourceMapConsumer(optimized.map);
|
|
const column = optimized.code.lastIndexOf(requireName + '(');
|
|
const loc = findLast(originalCode, 'require');
|
|
|
|
expect(consumer.originalPositionFor({line: 1, column}))
|
|
.toEqual(objectContaining(loc));
|
|
});
|
|
|
|
it('does not extract dependencies for polyfills', () => {
|
|
const result = optimizeModule(
|
|
transformResult,
|
|
{...optimizationOptions, isPolyfill: true},
|
|
);
|
|
expect(result.transformed.default.dependencies).toEqual([]);
|
|
});
|
|
});
|
|
});
|
|
|
|
function findLast(code, needle) {
|
|
const lines = code.split(/(?:(?!.)\s)+/);
|
|
let line = lines.length;
|
|
while (line--) {
|
|
const column = lines[line].lastIndexOf(needle);
|
|
if (column !== -1) {
|
|
return {line: line + 1, column};
|
|
}
|
|
}
|
|
}
|