Bugfix/require module regexp

Summary:
Resolves https://github.com/facebook/react-native/issues/316. Also updated the spec for the Haste Dependency Resolver. Not sure if these changes are the ones desired so feedback would be welcome!
Closes https://github.com/facebook/react-native/pull/368
Github Author: daviskoh <koh.davis.0@gmail.com>

Test Plan: ./runJestTests
This commit is contained in:
daviskoh 2015-03-31 17:54:38 -07:00
parent 2c4e9aba80
commit 28a0a2586d
5 changed files with 28 additions and 9 deletions

View File

@ -14,6 +14,7 @@ jest
.dontMock('path') .dontMock('path')
.dontMock('absolute-path') .dontMock('absolute-path')
.dontMock('../docblock') .dontMock('../docblock')
.dontMock('../../requirePattern')
.setMock('../../../ModuleDescriptor', function(data) {return data;}); .setMock('../../../ModuleDescriptor', function(data) {return data;});
describe('DependencyGraph', function() { describe('DependencyGraph', function() {

View File

@ -12,6 +12,7 @@ var ModuleDescriptor = require('../../ModuleDescriptor');
var q = require('q'); var q = require('q');
var fs = require('fs'); var fs = require('fs');
var docblock = require('./docblock'); var docblock = require('./docblock');
var requirePattern = require('../requirePattern');
var path = require('path'); var path = require('path');
var isAbsolutePath = require('absolute-path'); var isAbsolutePath = require('absolute-path');
var debug = require('debug')('DependecyGraph'); var debug = require('debug')('DependecyGraph');
@ -600,7 +601,6 @@ DependecyGraph.prototype._processAssetChange = function(eventType, file) {
/** /**
* Extract all required modules from a `code` string. * Extract all required modules from a `code` string.
*/ */
var requireRe = /\brequire\s*\(\s*[\'"]([^"\']+)["\']\s*\)/g;
var blockCommentRe = /\/\*(.|\n)*?\*\//g; var blockCommentRe = /\/\*(.|\n)*?\*\//g;
var lineCommentRe = /\/\/.+(\n|$)/g; var lineCommentRe = /\/\/.+(\n|$)/g;
function extractRequires(code) { function extractRequires(code) {
@ -609,7 +609,7 @@ function extractRequires(code) {
code code
.replace(blockCommentRe, '') .replace(blockCommentRe, '')
.replace(lineCommentRe, '') .replace(lineCommentRe, '')
.replace(requireRe, function(match, dep) { .replace(requirePattern, function(match, _, dep) {
deps.push(dep); deps.push(dep);
}); });

View File

@ -10,6 +10,7 @@
jest.dontMock('../') jest.dontMock('../')
.dontMock('q') .dontMock('q')
.dontMock('../requirePattern')
.setMock('../../ModuleDescriptor', function(data) {return data;}); .setMock('../../ModuleDescriptor', function(data) {return data;});
var q = require('q'); var q = require('q');
@ -226,11 +227,13 @@ describe('HasteDependencyResolver', function() {
}); });
var depGraph = depResolver._depGraph; var depGraph = depResolver._depGraph;
var dependencies = ['x', 'y', 'z']; var dependencies = ['x', 'y', 'z', 'a', 'b'];
var code = [ var code = [
'require("x")', 'require("x")',
'require("y")', 'require("y")',
'require("z")', 'require( "z" )',
'require( "a")',
'require("b" )',
].join('\n'); ].join('\n');
depGraph.resolveDependency.mockImpl(function(fromModule, toModuleName) { depGraph.resolveDependency.mockImpl(function(fromModule, toModuleName) {
@ -255,7 +258,9 @@ describe('HasteDependencyResolver', function() {
' require, requireDynamic, requireLazy, module, exports) {' + ' require, requireDynamic, requireLazy, module, exports) {' +
' require(\'changed\')', ' require(\'changed\')',
'require(\'y\')', 'require(\'y\')',
'require("z")});', 'require("z")',
'require("a")',
'require("b")});',
].join('\n')); ].join('\n'));
}); });
}); });

View File

@ -9,8 +9,8 @@
'use strict'; 'use strict';
var path = require('path'); var path = require('path');
var FileWatcher = require('../../FileWatcher');
var DependencyGraph = require('./DependencyGraph'); var DependencyGraph = require('./DependencyGraph');
var requirePattern = require('./requirePattern');
var ModuleDescriptor = require('../ModuleDescriptor'); var ModuleDescriptor = require('../ModuleDescriptor');
var declareOpts = require('../../lib/declareOpts'); var declareOpts = require('../../lib/declareOpts');
@ -25,7 +25,6 @@ var DEFINE_MODULE_CODE = [
].join(''); ].join('');
var DEFINE_MODULE_REPLACE_RE = /_moduleName_|_code_|_deps_/g; var DEFINE_MODULE_REPLACE_RE = /_moduleName_|_code_|_deps_/g;
var REL_REQUIRE_STMT = /require\(['"]([\.\/0-9A-Z_$\-]*)['"]\)/gi;
var validateOpts = declareOpts({ var validateOpts = declareOpts({
projectRoots: { projectRoots: {
@ -146,12 +145,12 @@ HasteDependencyResolver.prototype.wrapModule = function(module, code) {
} }
var relativizedCode = var relativizedCode =
code.replace(REL_REQUIRE_STMT, function(codeMatch, depName) { code.replace(requirePattern, function(codeMatch, _, depName) {
var depId = resolvedDeps[depName]; var depId = resolvedDeps[depName];
if (depId != null) { if (depId != null) {
return 'require(\'' + depId + '\')'; return 'require(\'' + depId + '\')';
} else { } else {
return codeMatch; return codeMatch.replace(/\s+/g, '');
} }
}); });

View File

@ -0,0 +1,14 @@
/**
* Copyright (c) 2015-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';
var REQUIRE_RE = /\brequire\s*?\(\s*?([\'"])([^"\']+)\1\s*?\)/g;
module.exports = REQUIRE_RE;